Geant4 Cross Reference |
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 46 G4Qt* G4Qt::instance = nullptr; 47 48 static G4bool QtInited = false; 49 50 /***************************************************************************/ 51 G4Qt* G4Qt::getInstance() 52 /***************************************************************************/ 53 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 54 { 55 return G4Qt::getInstance(0, nullptr, (char*)"Geant4"); 56 } 57 /***************************************************************************/ 58 G4Qt* 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 /***************************************************************************/ 68 G4Qt::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; 81 SetMainInteractor(qApp); 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) { 117 G4UImanager* UImanager = G4UImanager::GetUIpointer(); 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, jerome@suhard.fr 145 */ 146 147 // explicitly set the LC_NUMBERIC locale to "C" 148 setlocale(LC_NUMERIC, "C"); 149 } 150 /***************************************************************************/ 151 G4Qt::~G4Qt() 152 /***************************************************************************/ 153 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 154 { 155 if (this == instance) { 156 instance = nullptr; 157 } 158 } 159 /***************************************************************************/ 160 G4bool G4Qt::Inited() 161 /***************************************************************************/ 162 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 163 { 164 return QtInited; 165 } 166 /***************************************************************************/ 167 void* G4Qt::GetEvent() 168 /***************************************************************************/ 169 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 170 { 171 return nullptr; 172 } 173 /***************************************************************************/ 174 void G4Qt::FlushAndWaitExecution() 175 /***************************************************************************/ 176 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 177 { 178 if (! qApp) return; 179 qApp->processEvents(); 180 } 181 182 /***************************************************************************/ 183 bool G4Qt::IsExternalApp() 184 /***************************************************************************/ 185 /*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ 186 { 187 return externalApp; 188 } 189