Tôi đang cố gắng sử dụng pyqt để hiển thị cửa sổ QDialog tùy chỉnh khi một nút trên QMainWindow được nhấp. Tôi tiếp tục nhận được lỗi sau:Mở cửa sổ thứ hai trong 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'
Tôi đã xem qua một số hướng dẫn trực tuyến, nhưng hầu hết trong số đó chỉ dừng hiển thị cách sử dụng cửa sổ hộp thoại không tích hợp. Tôi đã tạo mã cho cả cửa sổ chính và hộp thoại bằng pyuic4. Những gì tôi nghĩ nên là mã có liên quan là dưới đây. Tôi đang thiếu gì ở đây?
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 câu hỏi: vì nó có vẻ như bạn không thể vượt qua đối số trong callbacks chức năng PyQt, được thiết lập một cái gì đó mà nếu không sẽ được thông qua như là một đối số (kém có tên là "c") là toàn cầu một cách tốt nhất để nhận thông tin về các chức năng đó?
'Ui_MainWindow .__ init__' có một đối số:' dbConnection' mà bạn dường như không vượt qua: 'self.ui = Ui_MainWindow()' - Mã của bạn hoạt động như thế nào? – fviktor
Rất tiếc. Tôi tạm thời gỡ bỏ các câu hỏi về cơ sở dữ liệu để xem liệu nó có phải là một phần của vấn đề không. Sau đó, tôi quên để recopy và repaste mã sau khi đưa nó trở lại. – James