Правильный способ выйти из окна и открыть еще одно в pyqt4? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть два окна (давайте назовем их X & Y. Когда X получает сигнал, он должен убить себя и запустить окно Y.

Как я пытаюсь это сделать:

  • Попытался выйти из окна X и запустить окно Y как нуб, вызвав метод exit и прочее. ( Получил ошибки сегментации, и цикл уже запускает вещи )
  • Попытался передать то же самоеприложение в другое окно, но все равно не повезло.

Мои X и Y выглядят так:

Это X, который вызывает Y

from PyQt4 import QtCore, QtGui
import sqlite3,hashlib,time
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def __init__(self):
        self.server = sqlite3.connect('ems.db')
        self.cursor = self.server.cursor()
    def dummy(self,*args):
        self.close()
        #close("Kallu")

    def setupUi(self, MainWindow):
        # A button calls dummy here
        # Other boring stuff

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        #Boring

import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)

def close(user): #Routine for closing window
    app.closeAllWindows()
    app.quit()
    app.exit()
    import y #here i import Y

    y.main(app)  #Dosent works even if i pass the app as i have to run
    #app again there but it'll show already running

if __name__ == "__main__":
    MainWindow.show()
    sys.exit(app.exec_())

Это Y-код

import time
try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(746, 503)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

import sys
def main(user):
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Мне не нужно, чтобы вы модифицировали код, скорее дайте мне понять, как это сделать и почему он работает?

1 Ответ

0 голосов
/ 14 февраля 2019

Программа - это не набор файлов, а набор взаимодействующих объектов, поэтому идея заключается в том, что оба окна находятся в одном месте, а при закрытии открывается другое окно.С другой стороны, PyQt рекомендует не модифицировать класс, сгенерированный Qt Designer, но создать новый класс, который наследует соответствующий виджет и использует начальный класс в качестве интерфейса (для получения дополнительной информации прочитайте документы ).

x.py

from PyQt4 import QtCore, QtGui

from y import YMainWindow

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s
try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.button = QtGui.QPushButton("Close")
        MainWindow.setCentralWidget(self.button)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        pass

class XMainWindow(QtGui.QMainWindow, Ui_MainWindow):
    closed = QtCore.pyqtSignal()

    def __init__(self, parent=None):
        super(XMainWindow, self).__init__(parent)
        self.setupUi(self)
        self.button.clicked.connect(self.dummy)

    @QtCore.pyqtSlot()
    def dummy(self):
        self.closed.emit()
        self.close()

import sys

def main():
    app = QtGui.QApplication.instance()
    if app is None:
        app = QtGui.QApplication(sys.argv)
    wx = XMainWindow()
    wy = YMainWindow()
    wx.closed.connect(wy.show)
    wx.show()
    return app.exec_()

if __name__ == "__main__":
    sys.exit(main())

y.py

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(746, 503)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        pass

class YMainWindow(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(YMainWindow, self).__init__(parent)
        self.setupUi(self)
...