首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制窗口和显示窗口

控制窗口和显示窗口
EN

Stack Overflow用户
提问于 2018-10-19 11:47:15
回答 1查看 452关注 0票数 1

我需要两个PyQt窗口在一台多显示器上同时运行:一个屏幕用于显示,另一个用于输入。在下面的示例中,我尝试使用带有按钮的简单窗口和带有标签的另一个窗口。当我按下按钮时,其他的windows标签文本应该会改变:

代码语言:javascript
复制
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget, QDialog, QInputDialog,QDesktopWidget,QVBoxLayout,QPushButton,QMainWindow,QAction,QFileDialog,QGroupBox,QGridLayout,QLabel


class Control_Pannel(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'Main Control Pannel'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 400
        self.text = "Display text"
        self.InitializeUI()


    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.inputBox = QGroupBox("Display")
        layout = QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        button = QPushButton('Push here to change text')
        layout.addWidget(button,0,0)
        button.clicked.connect(self.on_click)
        self.inputBox.setLayout(layout)
        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.inputBox)
        self.setLayout(windowLayout)
        self.show()

        app = QApplication(sys.argv)
        ex=InputWindows()
        sys.exit(app.exec_())


    @pyqtSlot()
    def on_click(self):
        InputWindows.text = "Modified text after button push"
        print(InputWindows.text)
        InputWindows.update()
        ##???? here i don't know how to make the changes be reflected in the other window, even if when i print the .text attribute it seems to have changed.



class InputWindows(QDialog):

    def __init__(self):
        super().__init__()
        self.title = 'Display Pannel'
        self.left = 5
        self.top = 5
        self.width = 300
        self.height = 300
        self.text = "Original Text"
        self.InitializeUI()

    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)


        self.createDisplayGridLayout()
        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)
        self.show()

    def createDisplayGridLayout(self):

        self.horizontalGroupBox = QGroupBox("Grid")
        layout = QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        self.label = QLabel(self.text)
        layout.addWidget(self.label,0,0) 



if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=Control_Pannel()
    sys.exit(app.exec_())

有了InputWindows.update(),我得到了first argument of unbound method must have a type QWidget,如果我尝试InputWindows.label.update(),我就得到了type object inputwindows has no attribute label

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-19 12:07:00

InputWindows是一个类,它是一个抽象,所以您通常需要创建一个对象,我问您:如果您有n个InputWindows,那么您将更新文本到哪个窗口呢?我们不知道,所以简单的逻辑表明,这样做是错误的。另一方面,将每个类看作一个黑匣子,在其中输入刺激并获得输出,在您的示例中,Control_Pannel必须有一个输出:新文本,但是输出是异步的,因为它是变化的,必须在更改时使用,而Qt中的输出是信号,所以我们必须创建它。另一方面,InputWindows必须接收信息才能创建更新QLabel中文本的插槽,如下所示:

代码语言:javascript
复制
import sys
from PyQt5 import QtCore, QtWidgets


class Control_Pannel(QtWidgets.QWidget):
    sendSignal = QtCore.pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.title = 'Main Control Pannel'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 400
        self.text = "Display text"
        self.InitializeUI()

    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.inputBox = QtWidgets.QGroupBox("Display")
        layout = QtWidgets.QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        button = QtWidgets.QPushButton('Push here to change text')
        layout.addWidget(button,0,0)
        button.clicked.connect(self.on_click)
        self.inputBox.setLayout(layout)
        windowLayout = QtWidgets.QVBoxLayout(self)
        windowLayout.addWidget(self.inputBox)

    @QtCore.pyqtSlot()
    def on_click(self):
        text = "Modified text after button push"
        self.sendSignal.emit(text)


class InputWindows(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.title = 'Display Pannel'
        self.left = 5
        self.top = 5
        self.width = 300
        self.height = 300
        self.InitializeUI()
        self.setText("Original Text")

    @QtCore.pyqtSlot(str)
    def setText(self, text):
        self.label.setText(text)

    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.createDisplayGridLayout()
        windowLayout = QtWidgets.QVBoxLayout(self)
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

    def createDisplayGridLayout(self):
        self.horizontalGroupBox = QtWidgets.QGroupBox("Grid")
        layout = QtWidgets.QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        self.label = QtWidgets.QLabel()
        layout.addWidget(self.label, 0, 0) 
        self.horizontalGroupBox.setLayout(layout)



if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)

    ex1 = Control_Pannel()
    ex1.show()
    ex2 = InputWindows()
    ex2.show()

    ex1.sendSignal.connect(ex2.setText)

    sys.exit(app.exec_())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52891742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档