我正在尝试使用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()

Bonus问题:因为看起来你不能在pyqt函数回调中传递参数,所以设置一些否则将作为参数(名称不合适的“c”)传递给全局的东西是获取信息的最佳方式进入那些功能?

有帮助吗?

解决方案

我过去做过这样的事情,我可以说它有效。 假设您的按钮名为“按钮”

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_()

这适用于我的应用程序,我相信它也应该与您的应用程序一起使用。希望它会有所帮助,应该做一些必要的修改才能将它应用到你的案例中。 每个人都过得愉快。

其他提示

Ui_Dialog应该是QtGui.QDialog固有的,而不是对象。

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 ___ ??? 使用insted:

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

您必须从基类调用 __ init __ methon(括号'()'中的名称)

QDialog有两个有用的惯例:

exec_()
show()

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

例如。对于exec _():

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以获得额外的父参数(必须在第二个位置))。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top