我正在尝试使用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”)是全局的最佳获取信息的方法那些功能?
答案 0 :(得分:18)
我过去做过这样的事情,我可以说它有效。 假设您的按钮名为“按钮”
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 :(得分:3)
Ui_Dialog应该是QtGui.QDialog固有的,而不是对象。
class Ui_Dialog(QtGui.QDialog):
def __init__(self, dbConnection):
QtGui.QDialog.__init__(self)
global c
c = dbConnection
答案 2 :(得分: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__
方法(括号中的名字'()')
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以获得额外的父参数(必须在第二个位置))。