Открыть второе окно в PyQt
Я пытаюсь использовать pyqt для отображения пользовательского окна 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()
бонусный вопрос: так как похоже, вы не можете передавать аргументы в обратных вызовах функции pyqt, устанавливает что-то, что в противном случае было бы передано как аргумент (плохо названный "c"), чтобы быть глобальным лучшим способом получить информацию в эти функции?
3 ответов
Я делал так в прошлом, и я могу сказать, что это работает. предполагая, что ваша кнопка называется "Button"
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___
???
Использовать вместо:
class StartQT4(QtGui.QMainWindow):
def __init__(self, parent=None):
QtGui.QMainWindow.__init__(self, parent)
нужно позвонить __init__
methon из базового класса (имя в скобках' ()')
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()
небольшой совет: Можно ли изменить классы пользовательского интерфейса в виджеты (с макетами). И, возможно, проблема в том, что ваш __init__
должно быть __init__(self, parent=None, dbConnection)
потому что при создании нового виджета в существующем PyQt может попытаться установить его как дочерние элементы существующего. (Поэтому измените все init, чтобы иметь дополнительный Родительский параметр (должен быть на второй позиции)).