在PyQ中打开第二个窗口

2024-05-13 06:30:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用pyqt在QMainWindow上的按钮被单击时显示自定义QDialog窗口。我一直得到以下错误:

$ python main.py 
DEBUG: Launch edit window
Traceback (most recent call last):
  File "/home/james/Dropbox/Database/qt/ui_med.py", line 23, in launchEditWindow
    dialog = Ui_Dialog(c)
  File "/home/james/Dropbox/Database/qt/ui_edit.py", line 15, in __init__
    QtGui.QDialog.__init__(self)
TypeError: descriptor '__init__' requires a 'sip.simplewrapper' object but received a 'Ui_Dialog'

我已经浏览了几篇在线教程,但大多数都没有展示如何使用非内置对话框窗口。我使用pyuic4生成了主窗口和对话框的代码。我认为应该是相关的代码如下。我错过了什么?

class Ui_Dialog(object):
    def __init__(self, dbConnection):
        QtGui.QDialog.__init__(self)
        global c
        c = dbConnection

class Ui_MainWindow(object):
    def __init__(self, dbConnection):
        global c
        c = dbConnection

    def launchEditWindow(self):
        print "DEBUG: Launch edit window"
        dialog = QtGui.QDialog()
        dialogui = Ui_Dialog(c)
        dialogui = setupUi(dialog)
        dialogui.show()

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        conn = sqlite3.connect('meds.sqlite')
        c = conn.cursor()
        self.ui = Ui_MainWindow(c)
        self.ui.setupUi(self)

def main():
    app = QtGui.QApplication(sys.argv)
    program = StartQT4()
    program.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

额外的问题:由于pyqt函数回调中似乎不能传递参数,设置一些本来作为参数传递的参数(名称不正确的“c”)是全局的,这是将信息传递到这些函数中的最佳方式吗?


Tags: pyselfuiobjectinitmaindefedit
3条回答

Ui_对话框应该是QtGui.QDialog固有的,而不是object。

class Ui_Dialog(QtGui.QDialog):
    def __init__(self, dbConnection):
        QtGui.QDialog.__init__(self)
        global c
        c = dbConnection
class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

为什么QtGui.QWidget.__init___??? 使用仪器:

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QMainWindow.__init__(self, parent)

您必须从基类调用__init__methon(括号中的名称“()”)

QDialog有两个有用的路由:

exec_()
show()

首先等待关闭对话框,然后可以访问任何字段窗体对话框。第二个显示对话框,但不要等待,因此要正常工作,必须设置一些插槽/信号连接以响应对话框操作。

例如,对于exec_u():

class Dialog(QDialog):
    def __init__(self, parent):
        QDialog.__init__(parent)
        line_edit = QLineEdit()
    ...

dialog = Dialog()
if dialog.exec_():   # here dialog will be shown and main script will wait for its closing (with no errors)
    data = dialog.line_edit.text()

小贴士:你能把你的ui类变成小部件吗(有布局)。也许问题是你的__init__应该是__init__(self, parent=None, dbConnection)

因为当您在现有窗口小部件中创建新窗口小部件时,PyQt可能会尝试将其设置为现有窗口小部件的子窗口小部件。(因此,将所有init更改为具有附加父参数(必须位于第二个位置)。

我以前也这样做过,我可以说是有效的。 假设你的按钮叫“按钮”

class Main(QtGui.QMainWindow):
    ''' some stuff '''
    def on_Button_clicked(self, checked=None):
        if checked==None: return
        dialog = QDialog()
        dialog.ui = Ui_MyDialog()
        dialog.ui.setupUi(dialog)
        dialog.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        dialog.exec_()

这对我的申请有效,我相信它也会对你的申请有效。希望它会有帮助,它应该是相当直接的做一些必要的改变,以适用于您的情况。 祝大家愉快。

相关问题 更多 >