2009-11-27 36 views
8

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 đó?

+0

'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

+0

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

Trả lời

16

Tôi đã thực hiện như thế này trong quá khứ và tôi có thể nói nó hoạt động. giả sử nút của bạn được gọi là "nút"

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

này làm việc cho ứng dụng của tôi, và tôi tin rằng nó sẽ làm việc với bạn là tốt. hy vọng nó sẽ giúp đỡ, nó nên được khá thẳng về phía trước để làm vài thay đổi cần thiết để áp dụng nó vào trường hợp của bạn. có một ngày tốt lành mọi người.

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

Tại sao QtGui.QWidget.__init___ ??? Sử dụng insted:

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

Bạn phải gọi __init__ methon từ lớp cơ sở (tên trong ngoặc '()')

QDialog có hai routins hữu ích:

exec_() 
show() 

Đầu tiên chờ đợi cho hộp thoại đóng và sau đó bạn có thể truy cập bất kỳ hộp thoại biểu mẫu trường nào. Hộp thoại hiển thị thứ hai nhưng không đợi, do đó, để hoạt động đúng, bạn phải đặt một số kết nối khe/tín hiệu để phản hồi các tác vụ thoại.

ví dụ: cho 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() 

Mẹo nhỏ: bạn có thể thay đổi lớp học của bạn thành widget (có bố trí) không. Và có lẽ vấn đề là __init__ của bạn phải là __init__(self, parent=None, dbConnection)

Bởi vì khi bạn tạo tiện ích mới trong PyQt hiện tại có thể cố gắng đặt làm tiện ích con ở chế độ hiện tại. (Vì vậy, thay đổi tất cả init để có param phụ huynh bổ sung (phải ở vị trí thứ hai)).

+1

Ok. Nhưng chương trình của tôi vẫn hoạt động giống như trước đây. Bất kỳ ý tưởng tại sao tôi nhận được lỗi "descriptor '__init__' đòi hỏi một đối tượng 'sip.simplewrapper' nhưng nhận được một 'Ui_Dialog'" khi tôi cố gắng để mở một cửa sổ thứ hai? – James

+0

Ok đã chỉnh sửa. Bây giờ nhìn vào đầu nhỏ. –

3

Ui_Dialog nên vốn có từ QtGui.QDialog, không phải đối tượng.

class Ui_Dialog(QtGui.QDialog): 
    def __init__(self, dbConnection): 
     QtGui.QDialog.__init__(self) 
     global c 
     c = dbConnection 
Các vấn đề liên quan