【问题标题】:QMainwindow doesn't show when I clicked a qpushbutton into a QWidget当我单击 qpushbutton 进入 QWidget 时,QMainwindow 不显示
【发布时间】:2015-05-23 04:29:42
【问题描述】:

我有一个 QWidget(登录表单)和 QMainWindow(主表单)。问题是当我在 qwidget 中单击一个 qpushbutton 时,应该出现 QmainWindow,但它没有。

class Ui_frmInicial(QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.resize(400, 250)
        self.btnOpen = QtGui.QPushButton(self)
        self.btnOpen.setGeometry(QtCore.QRect(110, 170, 111, 41))
        self.btnOpen.clicked.connect(self.btnOpen_clicked)
    def btnOpen_clicked(self):
        print('ok ')
        #mform = Ui_mainForm()
        #mform.show()
if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    ui = Ui_frmInicial()
    ui.show()
    sys.exit(app.exec_())

另一个类是:

class Ui_mainForm(QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        print('ok')
        self.resize(928, 695)
        QtCore.QMetaObject.connectSlotsByName(self)

会是什么错误?我从 Ui_frmInitial 运行该项目。在控制台中,我将 print 'ok' 显示到 init() 函数中,但 qmainwindow 没有显示。在此先感谢

【问题讨论】:

    标签: python-2.7 pyqt qwidget qmainwindow qpushbutton


    【解决方案1】:

    您需要确保,您打开的窗口不会在调用show 后立即被删除。

    我建议,您在主范围内定义窗口并用它初始化表单:

    class Ui_frmInicial(QWidget):
        def __init__(self, window):                         #window parameter
            QtGui.QWidget.__init__(self)
            self.resize(400, 250)
            self.btnOpen = QtGui.QPushButton(self)
            self.btnOpen.setGeometry(QtCore.QRect(110, 170, 111, 41))
            self.btnOpen.clicked.connect(lambda c: window.show()) #lambda callback
    
    if __name__ == "__main__":
        import sys
        app = QtGui.QApplication(sys.argv)
        window = Ui_mainForm()                              #window definition
        ui = Ui_frmInicial(window)                          #ui initialisation
        ui.show()
        sys.exit(app.exec_())
    

    或者至少作为表单的成员。

    【讨论】:

    • 非常感谢,但我遇到了错误。我由 def __init__(self, window) 更改:当我在控制台中运行时说 Traceback (最近一次调用最后一次):window.show() NameError: global name 'window' is not defined。请帮我。提前致谢。
    • 我添加了 cmets,我在其中更改了您的代码。我猜你只是忽略了那里的一些东西。
    • 我更改了代码,如下所示: self.btnOpen.clicked.connect(btnOpen_clicked) 和 def btnOpen_clicked(self):lambda c:self.window.show() 我会放在这里,因为在未来我会做生意顺理成章。 QMAinwindow 还没有出现。将 lambda 代码放入该函数是否正确?
    • 如果您在__init__ 中设置了self.window,则只需省略lambda。所以btnOpen_clicked(self): self.window.show() 可以解决问题。
    • 只需在self.window.show() 之后调用self.hide()。或者以某种方式更改您的设置,以便您可以完全删除表单。自己尝试一下,如果没有成功,请针对该新问题提出一个新问题。祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 2015-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2014-05-18
    • 1970-01-01
    相关资源
    最近更新 更多