سؤال

وأنا أحاول أن استخدام باي كيوت لإظهار مخصصة QDialog نافذة عند النقر فوق زر على QMainWindow. وأظل الحصول على الخطأ التالي:

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

والسؤال المكافأة: لأنه يبدو أنك لا يمكن تمرير الوسائط في الاسترجاعات وظيفة باي كيوت، هو وضع الشيء الذي لولاها تمريرها كحجة (لسوء المسمى "ج") أن تكون عالمية أفضل طريقة للحصول على المعلومات في تلك الوظائف؟

هل كانت مفيدة؟

المحلول

ولقد فعلت مثل هذا في الماضي، وأستطيع أن أقول أنه يعمل. على افتراض الزر الخاص بك يسمى "زر"

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

وهذا يعمل لطلبي، وأعتقد أنه يجب أن تعمل مع يدكم كذلك. نأمل أنها سوف تساعد، وينبغي أن تكون جميلة على التوالي إلى الأمام للقيام عدد قليل من التغييرات اللازمة لتطبيقه على قضيتك. يملك الجميع يوم جيد.

نصائح أخرى

وUi_Dialog يجب المتأصلة من QtGui.QDialog، وليس الاعتراض.

class Ui_Dialog(QtGui.QDialog):
    def __init__(self, dbConnection):
        QtGui.QDialog.__init__(self)
        global c
        c = dbConnection
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)

ويجب استدعاء methon __init__ من الفئة الأساسية (الاسم بين قوسين "() ')

وQDialog دينا اثنين من routins مفيدة:

exec_()
show()

أولا الانتظار لإغلاق مربع الحوار وبعد ذلك يمكنك الوصول إلى أي شكل الحوار المجال. الحوار المعرض الثاني ولكن لا تنتظر، وذلك للعمل بشكل صحيح يجب عليك تعيين بعض فتحة / إشارات الاتصالات على الاستجابة للأعمال الحوار.

وعلى سبيل المثال. لإكسيك _ ():

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

ورأس صغير: يمكنك تغيير الطبقات واجهة المستخدم الخاص بك إلى الحاجيات (مع تخطيطات). وربما تكمن المشكلة في أن __init__ الخاص بك يجب أن __init__(self, parent=None, dbConnection)

ولأن عند إنشاء واجهة مستخدم جديد في واحد باي كيوت الحالية قد تحاول تعيينه الأطفال من القائمة واحدة. (حتى تغيير جميع الحرف الأول أن يكون المعلمة الأم إضافي (يجب أن تكون على المركز الثاني)).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top