Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4Qt.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28// L. Garnier
29
30#include "G4Qt.hh"
31
32#include "G4UImanager.hh"
33#include "G4ios.hh"
34
35#include <qapplication.h>
36#include <qwidget.h>
37
38#include <cstdlib>
39#include <cstring>
40
41#ifdef G4VIS_USE_VTK_QT
42# include "QVTKOpenGLNativeWidget.h"
43# include <qsurfaceformat.h>
44#endif
45
46G4Qt* G4Qt::instance = nullptr;
47
48static G4bool QtInited = false;
49
50/***************************************************************************/
52/***************************************************************************/
53/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
54{
55 return G4Qt::getInstance(0, nullptr, (char*)"Geant4");
56}
57/***************************************************************************/
58G4Qt* G4Qt::getInstance(int a_argn, char** a_args, char* a_class)
59/***************************************************************************/
60/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
61{
62 if (instance == nullptr) {
63 instance = new G4Qt(a_argn, a_args, a_class);
64 }
65 return instance;
66}
67/***************************************************************************/
68G4Qt::G4Qt(int a_argn, char** a_args, char* /*a_class */
69)
70/***************************************************************************/
71/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
72{
73 argn = 0;
74 args = nullptr;
75 externalApp = false;
76
77 // Check if Qt already init in another external app
78 if (qApp) {
79 externalApp = true;
80 QtInited = true;
82 SetArguments(a_argn, a_args);
83 }
84 else {
85 if (! QtInited) { // Qt should be Inited once !
86 // Then two cases :
87 // - It is the first time we create G4UI (argc!=0)
88 // -> Inited and register
89 // - It is the first time we create G4VIS (argc == 0)
90 // -> Inited and NOT register
91
92 if (a_argn != 0) {
93 argn = a_argn;
94 args = a_args;
95 }
96 else { // argc = 0
97
98 // FIXME : That's not the good arguments, but I don't know how to get args from other
99 // Interactor. Ex: How to get them from G4Xt ?
100 argn = 1;
101 args = (char**)malloc(1 * sizeof(char*));
102 args[0] = (char*)malloc(10 * sizeof(char));
103 strncpy(args[0], "my_app \0", 9);
104 }
105
106 int* p_argn = (int*)malloc(sizeof(int));
107 *p_argn = argn;
108#ifdef WIN32
109 qApp->setAttribute(Qt::AA_UseDesktopOpenGL);
110#endif
111
112#ifdef G4VIS_USE_VTK_QT
113 QSurfaceFormat::setDefaultFormat(QVTKOpenGLNativeWidget::defaultFormat());
114#endif
115 new QApplication(*p_argn, args);
116 if (! qApp) {
118 G4int verbose = UImanager->GetVerboseLevel();
119 if (verbose >= 2) {
120 G4cout << "G4Qt : Unable to init Qt." << G4endl;
121 }
122 }
123 else {
124 QtInited = true;
125 if (a_argn != 0) {
126 SetMainInteractor(qApp);
127 }
128 SetArguments(a_argn, a_args);
129 }
130 }
131 }
132 // AddDispatcher ((G4DispatchFunction)XtDispatchEvent);
133
134 /*
135 * On some non-English locale, comma is used for the decimal separator instead of dot
136 * bringing to weird behavior of strtod (string to double) function in user application.
137 * This is "by design" from Qt, see https://bugreports.qt-project.org/browse/QTBUG-10994
138 *
139 * $ LC_NUMERIC=fr_FR.UTF-8 ./qtstrtod
140 * strtod(0.1) = 0
141 * $ LC_NUMERIC=C ./qtstrtod
142 * strtod(0.1) = 0.1
143 *
144 * Jerome Suhard, [email protected]
145 */
146
147 // explicitly set the LC_NUMBERIC locale to "C"
148 setlocale(LC_NUMERIC, "C");
149}
150/***************************************************************************/
152/***************************************************************************/
153/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
154{
155 if (this == instance) {
156 instance = nullptr;
157 }
158}
159/***************************************************************************/
161/***************************************************************************/
162/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
163{
164 return QtInited;
165}
166/***************************************************************************/
168/***************************************************************************/
169/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
170{
171 return nullptr;
172}
173/***************************************************************************/
175/***************************************************************************/
176/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
177{
178 if (! qApp) return;
179 qApp->processEvents();
180}
181
182/***************************************************************************/
184/***************************************************************************/
185/*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
186{
187 return externalApp;
188}
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
Definition G4Qt.hh:50
G4bool Inited() override
Definition G4Qt.cc:160
static G4Qt * getInstance()
Definition G4Qt.cc:51
void * GetEvent() override
Definition G4Qt.cc:167
bool IsExternalApp()
Definition G4Qt.cc:183
void FlushAndWaitExecution() override
Definition G4Qt.cc:174
~G4Qt() override
Definition G4Qt.cc:151
G4int GetVerboseLevel() const
static G4UImanager * GetUIpointer()
void SetMainInteractor(G4Interactor)
void SetArguments(int, char **)