pyqt5 Есть ли ограничение на загрузку виджетов с помощью clicked.connect? - PullRequest
0 голосов
/ 31 августа 2018

Я использую QPushButton для загрузки интерфейса. First -> Jumin -> Department -> next -> next Я хочу создать пользовательский интерфейс по порядку. Проблема в том, что я не могу загрузить третий отдел в окно QMainwindow. Я не знаю почему

Когда вы создаете виджет в QVBoxLayout, он меняет размер виджета в соответствии с обоями, например wxpython layout (wx.all). Не можете изменить position (move) и size (resize) с помощью автоматического центрирования?

import sys
from PyQt5.QtWidgets import *
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.center_widget = QWidget()
        self.setCentralWidget(self.center_widget)
        self.FirstUI()

    def FirstUI(self):
        self.btn1 = QPushButton('test1', self)
        self.btn1.move(50, 50)
        self.btn1.clicked.connect(self.btn1_click)

    def JuminUI(self):
        self.ju1 = QLineEdit('13')
        self.btn2 = QPushButton('^^^^^^^^^^')
        self.ju_text = QLabel('asd')
        self.jumim_layout = QVBoxLayout()
        self.jumim_layout.addWidget(self.ju_text)
        self.jumim_layout.addWidget(self.ju1)
        self.jumim_layout.addWidget(self.btn2)
        self.centralWidget().setLayout(self.jumim_layout)
        self.btn2.clicked.connect(self.btn2_click)

    def DepartmentUI(self):
        self.depart_layout = QVBoxLayout()
        self.depart_layout.addWidget(QPushButton('sdfsdf'))
        self.centralWidget().setLayout(self.depart_layout)

    def btn1_click(self):
        self.btn1.deleteLater()
        self.JuminUI()

    def btn2_click(self):
        self.ju1.deleteLater()
        self.btn2.deleteLater()
        self.ju_text.deleteLater()
        self.DepartmentUI()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    fream = MainWindow()
    fream.show()
    app.exec_()

1 Ответ

0 голосов
/ 31 августа 2018

создание и удаление виджетов - это почти всегда плохая идея, и ваш код попадает в эти плохие идеи, всегда лучше спрятать виджеты, и для этого вы должны использовать QStackedWidget, что QStackedWidget делает просто виджет виден на всех виджетах, которые были вам назначены при изменении currentIndex.

import sys
from functools import partial
from PyQt5 import QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.center_widget = QtWidgets.QStackedWidget()
        self.setCentralWidget(self.center_widget)
        self.FirstUI()
        self.JuminUI()
        self.DepartmentUI()

    def FirstUI(self):
        widget = QtWidgets.QWidget()
        self.btn1 = QtWidgets.QPushButton('test1', widget)
        self.btn1.move(50, 50)

        self.center_widget.addWidget(widget)
        self.btn1.clicked.connect(partial(self.center_widget.setCurrentIndex, 1))

    def JuminUI(self):
        widget = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(widget)

        self.ju1 = QtWidgets.QLineEdit('13')
        self.btn2 = QtWidgets.QPushButton('^^^^^^^^^^')
        self.ju_text = QtWidgets.QLabel('asd')

        lay.addWidget(self.ju_text)
        lay.addWidget(self.ju1)
        lay.addWidget(self.btn2)

        self.center_widget.addWidget(widget)
        self.btn2.clicked.connect(partial(self.center_widget.setCurrentIndex, 2))

    def DepartmentUI(self):
        widget = QtWidgets.QWidget()
        lay = QtWidgets.QVBoxLayout(widget)
        lay.addWidget(QtWidgets.QPushButton('sdfsdf'))

        self.center_widget.addWidget(widget)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    fream = MainWindow()
    fream.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...