2009-11-27 153 views
8

我试图在点击QMainWindow上的一个按钮时使用pyqt显示一个自定义QDialog窗口。我不断收到以下错误:在PyQt中打开第二个窗口

$ 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”)是全球性的最佳途径将信息转化为这些功能?

+0

'Ui_MainWindow .__ init__'有一个参数:'dbConnection',你似乎没有通过:'self.ui = Ui_MainWindow()' - 你的代码如何工作? – fviktor 2009-11-27 18:46:09

+0

哎呦。我暂时删除了数据库中的问题,看看它是否是问题的一部分。然后,我忘了重新放入代码后重新加入。 – James 2009-11-27 21:31:31

回答

16

我已经在过去这样做了,我可以告诉它的工作。 假设你的按钮被称为“按钮”

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

这工作对我的申请,我相信它应该与你的正常工作。希望这会有所帮助,那么将它应用于您的案例所需的一些更改应该是相当直接的。 每个人都有美好的一天。

1
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的有两个有用的routins:

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

+1

好的。但是我的程序仍然像以前一样运行。任何想法为什么我得到错误“描述符__init__”需要一个'sip.simplewrapper'对象,但是当我尝试打开第二个窗口时收到'Ui_Dialog'“? – James 2009-11-28 19:42:56

+0

Ok编辑。现在看小提示。 – 2009-11-29 10:02:18

3

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

class Ui_Dialog(QtGui.QDialog): 
    def __init__(self, dbConnection): 
     QtGui.QDialog.__init__(self) 
     global c 
     c = dbConnection 
相关问题