Мой графический интерфейс не работает (кнопки .. и т. Д.), Когда я вызываю другой QtWidget в главном окне - PullRequest
0 голосов
/ 20 мая 2018

Я сделал графический интерфейс в Python, используя Qt designer, и я перевёл его на Pyqt5, архитектура моего GUI такова: главное окно, и когда я нажимаю на один из пунктов строки меню, центральный виджет заменяется другим QtWidget (у которого есть другойкласс), проблема в том, что когда я заменяю центральный виджет, кнопки не работают, и если я выполняю этот QtWidget напрямую, он работает.

это мой основной код:

    # -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtCore import QCoreApplication
import os
import testModelC


class Ui_DzSenti(object):

    def setupUi(self, DzSenti):
        DzSenti.setObjectName("DzSenti")
        DzSenti.resize(900, 500)
        self.centralwidget = QtWidgets.QWidget(DzSenti)
        self.centralwidget.setObjectName("centralwidget")
        #***************************************************************************************************
        self.centralwidget = QtWidgets.QWidget(DzSenti)
        self.centralwidget.setObjectName("centralwidget")
        DzSenti.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(DzSenti)
        self.menubar.setEnabled(True)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 25))
        self.menubar.setNativeMenuBar(False)
        self.menubar.setObjectName("menubar")
        self.menuTeste = QtWidgets.QMenu(self.menubar)
        self.menuTeste.setObjectName("menuTeste")
        DzSenti.setMenuBar(self.menubar)
        self.actionTeste_de_mod_le = QtWidgets.QAction(DzSenti)
        self.actionTeste_de_mod_le.setObjectName("actionTeste_de_mod_le")
        self.menuTeste.addAction(self.actionTeste_de_mod_le)
        self.menubar.addAction(self.menuTeste.menuAction())
        self.retranslateUi(DzSenti)
        QtCore.QMetaObject.connectSlotsByName(DzSenti)

    def retranslateUi(self, DzSenti):
        _translate = QtCore.QCoreApplication.translate
        DzSenti.setWindowTitle(_translate("DzSenti", "DzSenti"))
        self.menuTeste.setTitle(_translate("DzSenti", "Teste"))
        self.actionTeste_de_mod_le.setText(_translate("DzSenti", "Teste de modèle"))
        self.actionTeste_de_mod_le.triggered.connect(self.move_testeModel)

    def move_testeModel(self):
        Form = QtWidgets.QWidget()
        ui = testModelC.Ui_testeModel()
        ui.setupUi(Form)
        DzSenti.setCentralWidget(Form)

        #Method 2 doesn't work either by calling the qtwidget in another window (dialog)
        '''testModel1 = QtWidgets.QWidget()
        ui = testModelC.Ui_testeModel()
        ui.setupUi(testModel1)
        self.dialog = testModel1
        self.dialog.show()'''

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    DzSenti = QtWidgets.QMainWindow()
    ui = Ui_DzSenti()
    ui.setupUi(DzSenti)
    DzSenti.show()
    sys.exit(app.exec_())

и этот мой код QtWidget:

   # -*- coding: utf-8 -*-

from PyQt5.QtCore import pyqtSlot
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox

class Ui_testeModel(object):

    def setupUi(self, testeModel):
        testeModel.setObjectName("testeModel")
        testeModel.resize(815, 460)
        self.texteTeste_plainTextEdit = QtWidgets.QPlainTextEdit(testeModel)
        self.texteTeste_plainTextEdit.setGeometry(QtCore.QRect(70, 80, 721, 201))
        self.texteTeste_plainTextEdit.setObjectName("texteTeste_plainTextEdit")
        self.label_13 = QtWidgets.QLabel(testeModel)
        self.label_13.setGeometry(QtCore.QRect(30, 50, 201, 17))
        self.label_13.setObjectName("label_13")
        self.label_9 = QtWidgets.QLabel(testeModel)
        self.label_9.setGeometry(QtCore.QRect(200, 10, 441, 31))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.label_9.setFont(font)
        self.label_9.setAlignment(QtCore.Qt.AlignCenter)
        self.label_9.setObjectName("label_9")
        self.Button_vider = QtWidgets.QPushButton(testeModel)
        self.Button_vider.setGeometry(QtCore.QRect(500, 350, 181, 41))
        self.Button_vider.setObjectName("Button_voirPrecision")
        self.Button_categoriser = QtWidgets.QPushButton(testeModel)
        self.Button_categoriser.setGeometry(QtCore.QRect(180, 350, 171, 41))
        self.Button_categoriser.setObjectName("Button_categoriser")
        self.Button_categoriser.clicked.connect(self.wrapper)
        self.Button_vider.clicked.connect(self.wrapper2)
        self.retranslateUi(testeModel)
        QtCore.QMetaObject.connectSlotsByName(testeModel)

    def retranslateUi(self, testeModel):
        _translate = QtCore.QCoreApplication.translate
        testeModel.setWindowTitle(_translate("testeModel", "Tester le modèle"))
        self.label_13.setText(_translate("testeModel", "Entrer un texte :"))
        self.label_9.setText(_translate("testeModel", "Tester le modèle"))
        self.Button_vider.setText(_translate("testeModel", "Vider"))
        self.Button_categoriser.setText(_translate("testeModel", "Catégoriser"))

    def wrapper(self):
        self.texteTeste_plainTextEdit.setPlainText("Hello it work")

    def wrapper2(self):
        self.texteTeste_plainTextEdit.setPlainText("")

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    testeModel = QtWidgets.QWidget()
    ui = Ui_testeModel()
    ui.setupUi(testeModel)
    testeModel.show()
    sys.exit(app.exec_())

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

После дальнейших исследований я обнаружил, в чем проблема, я просто забыл использовать self , как в следующем коде в классе Ui_DzSenti:

self.Form = QtWidgets.QWidget()
ui = testModelC.Ui_testeModel()
ui.setupUi(self.Form)
DzSenti.setCentralWidget(self.Form)

, поэтому класс будет таким:

    # -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtCore import QCoreApplication
import os
import testModelC


class Ui_DzSenti(object):

    def setupUi(self, DzSenti):
        DzSenti.setObjectName("DzSenti")
        DzSenti.resize(900, 500)
        self.centralwidget = QtWidgets.QWidget(DzSenti)
        self.centralwidget.setObjectName("centralwidget")
        #***************************************************************************************************
        self.centralwidget = QtWidgets.QWidget(DzSenti)
        self.centralwidget.setObjectName("centralwidget")
        DzSenti.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(DzSenti)
        self.menubar.setEnabled(True)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 25))
        self.menubar.setNativeMenuBar(False)
        self.menubar.setObjectName("menubar")
        self.menuTeste = QtWidgets.QMenu(self.menubar)
        self.menuTeste.setObjectName("menuTeste")
        DzSenti.setMenuBar(self.menubar)
        self.actionTeste_de_mod_le = QtWidgets.QAction(DzSenti)
        self.actionTeste_de_mod_le.setObjectName("actionTeste_de_mod_le")
        self.menuTeste.addAction(self.actionTeste_de_mod_le)
        self.menubar.addAction(self.menuTeste.menuAction())
        self.retranslateUi(DzSenti)
        QtCore.QMetaObject.connectSlotsByName(DzSenti)

    def retranslateUi(self, DzSenti):
        _translate = QtCore.QCoreApplication.translate
        DzSenti.setWindowTitle(_translate("DzSenti", "DzSenti"))
        self.menuTeste.setTitle(_translate("DzSenti", "Teste"))
        self.actionTeste_de_mod_le.setText(_translate("DzSenti", "Teste de modèle"))
        self.actionTeste_de_mod_le.triggered.connect(self.move_testeModel)

    def move_testeModel(self):
        self.Form = QtWidgets.QWidget()
        ui = testModelC.Ui_testeModel()
        ui.setupUi(self.Form)
        DzSenti.setCentralWidget(self.Form)

        #Method 2 doesn't work either by calling the qtwidget in another window (dialog)
        '''testModel1 = QtWidgets.QWidget()
        ui = testModelC.Ui_testeModel()
        ui.setupUi(testModel1)
        self.dialog = testModel1
        self.dialog.show()'''

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    DzSenti = QtWidgets.QMainWindow()
    ui = Ui_DzSenti()
    ui.setupUi(DzSenti)
    DzSenti.show()
    sys.exit(app.exec_())
0 голосов
/ 21 мая 2018

Я на самом деле не знаю, что здесь происходит ... но переписать move_testeModel на самом деле помогает:

def move_testeModel(self):
    try:
        Form = QtWidgets.QWidget()
        ui = Ui_testeModel()
        ui.setupUi(Form)
        ui.Button_categoriser.clicked.connect(lambda :ui.wrapper())
        DzSenti.setCentralWidget(Form)
    except Exception as e:
        print(e)

Это соединит сигнал Button_categoriser clicked дважды и волшебным образом исправит вторую кнопкусигнал ....

Я думаю, что это может иметь какое-то отношение к функции retranslateUI.Надеюсь, кто-то еще может указать, в чем заключается настоящая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...