2017-07-06 122 views
0

我正在尝试创建一个用作集线器的用户界面,以启动已创建的所有其他工具。问题是,如果我尝试从toolshub UI启动UI,它不会让我因为事件循环已经在运行。我知道当启动新窗口时,我不能执行此应用程序= QtGui.QApplication(sys.argv)和APP.exec_(),因为当我为toolshub UI执行此操作时,事件循环已经在运行。但我无法弄清楚如何以另一种方式做到这一点。Pyside/Pyqt从窗口打开新窗口(事件循环已在运行)

以下是其中一个工具的示例代码,它自行启动。

global APP 
APP = None 

class toolwindow(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolwindow, self).__init__(parent) 
     self.setWindowTitle('tool') 
     self.setMinimumSize(QtCore.QSize(500, 600)) 
     self.setMaximumSize(QtCore.QSize(500, 600)) 
     self.create_ui() 

    def create_ui(self): 
     code goes here 

    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 
     return 

def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    win= toolwindow() 
    win.show() 
    APP.exec_() 

if __name__ == '__main__': 
    start_ui() 
global APP 
APP = None 

现在这里是toolshub用户界面的代码。这些都是独立的脚本。在toolshub中,我正在导入上述工具。

import tool 
LOGGER = logging.getLogger(__name__) 
global APP 
APP = None 

class toolsHub(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolsHub, self).__init__(parent) 
     self.setWindowTitle('Tools Launcher') 
     self.setSizeGripEnabled(False) 
     self.setMinimumSize(QtCore.QSize(300, 200)) 
     self.setMaximumSize(QtCore.QSize(300, 200)) 
     self.create_layouts() 

    def create_layouts(self): 
     master_layout = QtGui.QVBoxLayout() 
     self.setLayout(master_layout) 
     self.input_widgets() 
     grid_layout = QtGui.QGridLayout() 
     grid_layout.addWidget(self.env_creator, 0, 0) 
     grid_layout.addWidget(self.p4dl, 1, 0) 
     master_layout.addLayout(grid_layout) 

    def input_widgets(self): 
     self.tool_button= QtGui.QPushButton('launch tool') 
     self.tool_button.clicked.connect(self.launch_tool) 

    def launch_tool(self): 
     tool.start_ui() 

    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 
     return 


def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    toolui = toolsHub() 
    toolui.show() 
    APP.exec_() 

if __name__ == '__main__': 
    start_ui() 

那么如何编写和构造这些以便我可以从toolshub UI中打开工具UI?我猜测我必须改变的代码是工具UI,我知道我必须取出APP = QtGui.QApplication(sys.argv)和APP.exec_(),但不知道如何启动它。

感谢

回答

0

应该只有的QApplication的一个实例,这应该创建任何控件之前创建的,因此不需要初始化它的每个模块中。

为了要显示的QDialog的正常,你必须执行其exec_()

tool.py:

[...] 
def start_ui(): 
    win= toolwindow() 
    win.exec_() 

完整代码:

tool.py

from PySide import QtGui, QtCore 

APP = None 

class toolwindow(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolwindow, self).__init__(parent) 
     self.setWindowTitle('tool') 
     self.setMinimumSize(QtCore.QSize(500, 600)) 
     self.setMaximumSize(QtCore.QSize(500, 600)) 
     self.create_ui() 

    def create_ui(self): 
     pass 
    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 
     return 

def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    win= toolwindow() 
    win.exec_() 

if __name__ == '__main__': 
    start_ui() 

main.py

from PySide import QtGui, QtCore 
import tool 
import logging 
import sys 

LOGGER = logging.getLogger(__name__) 
APP = None 

class toolsHub(QtGui.QDialog): 

    def __init__(self, parent=None): 
     init_app() 
     super(toolsHub, self).__init__(parent) 
     self.setWindowTitle('Tools Launcher') 
     self.setSizeGripEnabled(False) 
     self.setMinimumSize(QtCore.QSize(300, 200)) 
     self.setMaximumSize(QtCore.QSize(300, 200)) 
     self.create_layouts() 

    def create_layouts(self): 
     master_layout = QtGui.QVBoxLayout() 
     self.setLayout(master_layout) 
     self.input_widgets() 
     grid_layout = QtGui.QGridLayout() 
     grid_layout.addWidget(QtGui.QPushButton(), 0, 0) 
     grid_layout.addWidget(QtGui.QPushButton(), 1, 0) 
     master_layout.addLayout(grid_layout) 

    def input_widgets(self): 
     self.tool_button= QtGui.QPushButton('launch tool') 
     self.tool_button.clicked.connect(self.launch_tool) 
     self.layout().addWidget(self.tool_button) 

    def launch_tool(self): 
     tool.start_ui() 

    def closeEvent(self, event): 
     QtGui.QDialog.closeEvent(self, event) 


def init_app(): 
    global APP 
    APP = QtGui.QApplication.instance() 
    if not APP: 
     APP = QtGui.QApplication(sys.argv) 
    return 

def start_ui(): 
    toolui = toolsHub() 
    toolui.show() 
    APP.exec_() 

if __name__ == '__main__': 
    start_ui() 
+0

真棒说做到了! 所以我应该将init_app模块放在tool.py中设置APP = QtGui.QApplication(sys.argv)的地方? 如果我拿出来它仍然有效,所以它似乎并不需要。仅限于main.py? – ghost654