微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyQt5:如何将子窗口小部件移到主窗口?

如何解决PyQt5:如何将子窗口小部件移到主窗口?

代码将打开3个单独的窗口:

1) main window
2) widgetA 
3) widgetB.

如何以将2和3移为1的方式编写代码

因此,我们只有一个主窗口,并且在其中有2个可以相互通信的小部件。另外,还有一个附加功能:我们如何编写一种函数,使其侦听传入的数据然后将其发送出去?

class mainwindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(mainwindow,self).__init__(parent)

        self.button = QtWidgets.QPushButton("Click Me",self)
        self.button.clicked.connect(self.on_button_clicked)

        self.setCentralWidget(self.button)

        self.widgetA = widgetA()
        self.widgetB = widgetB()

        self.widgetA.procStart.connect(self.widgetB.on_procStart)
        self.widgetB.procDone.connect(self.widgetA.on_widgetB_procDone)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.widgetA.show()
        self.widgetB.show()

        self.widgetA.raise_()

class widgetA(QtWidgets.QWidget):
    procStart = QtCore.pyqtSignal(str)

    def __init__(self,parent=None):
        super(widgetA,self).__init__(parent)

        self.lineEdit = QtWidgets.QLineEdit(self)
        self.lineEdit.setText("Hello!")

        self.button = QtWidgets.QPushButton("Send Message to B",self)
        self.button.clicked.connect(self.on_button_clicked)

        self.layout = QtWidgets.QHBoxLayout(self)
        self.layout.addWidget(self.lineEdit)
        self.layout.addWidget(self.button)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.procStart.emit(self.lineEdit.text())

    @QtCore.pyqtSlot(str)
    def on_widgetB_procDone(self,message):
        self.lineEdit.setText("From B: " + message)

        self.raise_()


class widgetB(QtWidgets.QWidget):

    procDone = QtCore.pyqtSignal(str)

    def __init__(self,parent=None):
        super(widgetB,self).__init__(parent)

        self.lineEdit = QtWidgets.QLineEdit(self)
        self.button = QtWidgets.QPushButton("Send Message to A",self)
        self.layout = QtWidgets.QHBoxLayout(self)
        self.layout.addWidget(self.lineEdit)
        self.layout.addWidget(self.button)

        self.button.clicked.connect(self.on_button_clicked)

    @QtCore.pyqtSlot()
    def on_button_clicked(self):
        self.procDone.emit(self.lineEdit.text())

    @QtCore.pyqtSlot(str)
    def on_procStart(self,message):
        self.lineEdit.setText("From A: " + message)

        self.raise_()

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    main = mainwindow()
    main.show()
    sys.exit(app.exec_())

解决方法

如果您需要在“顶级窗口”中显示多个控件(无论是QWidget,QDialog还是QMainWindow),则需要创建一个容器控件。

在您的情况下,您正在使用QMainWindow,它是Qem的一种非常特殊的QWidget,因为它具有自己的(内部且几乎不可访问的)布局。通常在QMainWindow中显示的主要内容(除了其菜单栏,状态栏,工具栏和停靠栏)被称为“中央小部件”,并且您将其设置为QPushButton,因此没有 room 还有什么。

最常见和常规的方法是创建一个新的QWidget(这是一个空的小部件,用作 all Qt小部件的基础),为其设置一个布局并添加实际的小部件对此:

class mainwindow(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(mainwindow,self).__init__(parent)

        container = QtWidgets.QWidget()
        self.setCentralWidget(container)
        # using a widget as an argument in a Qt layout constructor results in 
        # automatically setting the layout for that widget
        layout = QtWidgets.QVBoxLayout(container)

        self.button = QtWidgets.QPushButton("Click Me",self)
        self.button.clicked.connect(self.on_button_clicked)

        self.widgetA = widgetA()
        self.widgetB = widgetB()

        layout.addWidget(self.button)
        layout.addWidget(self.widgetA)
        layout.addWidget(self.widgetB)
        # ...

请注意,如果您不是使用QMainWindow而是使用标准的QWidget或QDialog,则显然不需要使用“中央小部件”,而只需在当前实例上创建新的布局即可({{1} }。

self

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。