PyQt

2009-11-27 18 views
8

için ikinci bir pencere aç QMainWindow üzerindeki bir düğme tıklatıldığında özel bir QDialog penceresi göstermek için pyqt kullanmaya çalışıyorum. Aşağıdaki hatayı almaya devam: Birkaç çevrimiçi öğreticiler üzerine gittimPyQt

$ 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' 

, ancak bunların çoğu yerleşik iletişim penceresinden olmayan bir nasıl kullanılacağını gösteren sadece kısa durdurun. Pyuic4 kullanarak hem ana pencere hem de diyalog için kod oluşturdum. İlgili kodun ne olması gerektiğini düşünüyorum. Burada neyi özlüyorum?

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 soru: Eğer aksi iyi yolu küresel olması (kötü adlı "C") bir argüman olarak geçirilebilir bir şey kuruyor, PyQt fonksiyon geri çağrıları argümanları geçemez gibi görünüyor beri Bu fonksiyonlara bilgi almak için?

+0

'Ui_MainWindow .__ init__' bir argümana sahiptir:' dbConnection' geçemezsiniz: 'self.ui = Ui_MainWindow()' - Kodunuz nasıl çalışır? – fviktor

+0

Whoops. Sorunun bir parçası olup olmadığını görmek için veritabanı nesnelerini geçici olarak kaldırdım. Ardından, kodu tekrar girdikten sonra kodu yeniden yazmayı ve yeniden kaydetmeyi unuttum. – James

cevap

16

Geçmişte böyle yaptım ve çalıştığını söyleyebilirim. Düğmenizi varsayarak

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

Bu benim uygulama için çalışıyor "Düğme" olarak adlandırılan ve bunu yanı sizinki ile çalışmak gerektiğine inanıyoruz edilir. Umarım yardım eder, davanıza uygulamak için gereken birkaç değişikliği yapmak için oldukça yalın olmalıdır. herkesin iyi günler.

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

Neden QtGui.QWidget.__init___ ??? Kullanım Insted: İletişim kutusunu kapatmak için

exec_() 
show() 

İlk bekleme:

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

Sen (parantez içindeki adı '()')

QDialog iki yararlı routins sahip taban sınıfından __init__ methon çağırmalıdır ve daha sonra herhangi bir alan formu iletişim kutusuna erişebilirsiniz. İkinci gösteri iletişim kutusu ancak beklemeyin, bu nedenle düzgün çalışması için iletişim eylemlerine yanıt vermek üzere bazı yuva/sinyal bağlantılarını ayarlamanız gerekir. Örn.,

örn. exec_() için:

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

Küçük bir ipucu: Eğer (düzenleri) widget içine ui sınıfları değiştirebilir. Ve belki sorun bir tane mevcut çocukları olarak ayarlamak deneyebilir bir PyQt mevcut yeni pencere öğesi oluştururken Çünkü senin __init____init__(self, parent=None, dbConnection)

olması gerektiğidir. (Bu nedenle tüm ebeveynleri ek ebeveyn param olacak şekilde değiştirin (ikinci pozisyonda olmalıdır)).

+1

Tamam. Ama programım hala eskisi gibi çalışıyor. "Descriptor '__init__' hatası alıyorum neden bir 'sip.simplewrapper' nesnesi gerektirir ama ikinci bir pencereyi açmaya çalıştığımda bir 'Ui_Dialog' aldı? – James

+0

Tamam Düzenlendi. Şimdi küçük ipucu bak. –

3

Ui_Dialog, QtGui.QDialog öğesinin doğasında olmamalıdır.

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