【问题标题】:Triggering and updating a docked window触发和更新停靠窗口
【发布时间】:2017-03-31 16:24:36
【问题描述】:

我正在尝试使用 GUI 控制一些阀门,并在按下按钮时更新显示。以下代码会产生正确的初始显示,但是当我单击其中一个复选框时,我总是得到i=2 的值,而当未选中时,我得到i=0。我也不知道如何更新停靠窗口,以便消息从close 切换到open,反之亦然。我确实看到数组中self.states 中的结果值发生了变化,但我总是留下['open', 'closed', 'open', 'closed', 'closed', 'closed'] 虽然这已更改,但屏幕右侧的红色closed 不会更改为`open

class ApplicationWindow(gui.QMainWindow):
    def __init__(self):
        self.nCheckBoxes=6
        self.states = ['closed']*self.nCheckBoxes

        gui.QMainWindow.__init__(self)
        self.setAttribute(core.Qt.WA_DeleteOnClose)
        self.setWindowTitle("PiView")
        self.file_menu = gui.QMenu('&File', self)
        self.file_menu.addAction('&Quit', self.fileQuit, core.Qt.CTRL + core.Qt.Key_Q)
        self.menuBar().addMenu(self.file_menu)
        self.help_menu = gui.QMenu('&Help', self)
        self.menuBar().addSeparator()
        self.menuBar().addMenu(self.help_menu)
        self.help_menu.addAction('&About', self.about)
        self.help_menu.addAction('&Docs', self.doc)
        self.main_widget = gui.QWidget(self)

        l = gui.QVBoxLayout(self.main_widget)
        self.dc = MyMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        l.addWidget(self.dc)

        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)

        self.dw = self.createDockWindows(self.dc)
        self.statusBar().showMessage("Initialized", 2000)

    def createDockWindows(self, MyMplCanvas):
        """
        Create all the dock widgets
        """
        self.drawValves()
        self.drawGraphAdjustments()
        self.drawStartAndStop()

    def drawValves(self):
        cboxes = gui.QDockWidget("Controls", self)
        cboxes.setAllowedAreas(core.Qt.LeftDockWidgetArea)
        w = gui.QWidget()
        #layout = gui.QVBoxLayout()
        layout = gui.QGridLayout()
        w.setLayout(layout)

        self.c = [0]*self.nCheckBoxes
        # Create self.nCheckBoxes
        msgBox = gui.QLabel()
        msgBox.setText("States")
        font = gui.QFont()
        font.setBold(True)
        msgBox.setFont(font)
        msgBox.setStyleSheet("color: rgb(255,0,0)")
        layout.addWidget(msgBox,0,1)
        for i in range(self.nCheckBoxes):
            self.c[i] = gui.QCheckBox("Valve " + str(i))
            self.c[i].setChecked(False)
            #self.c[i].stateChanged.connect(lambda:self.btnstate(self.c[i]))
            #self.c[i].stateChanged.connect(self.checkedBox)
            self.c[i].stateChanged.connect(lambda i: self.checkedBox(i))
            layout.addWidget(self.c[i],i+1,0)
            # Messages
            msgBox = gui.QLabel()
            msgBox.setText(self.states[i])
            if self.states[i] == 'closed':
                msgBox.setStyleSheet("color: rgb(255,0,0)")
            else:
                msgBox.setStyleSheet("color: rgb(0,255,0)")
            layout.addWidget(msgBox,i+1,1)

        spacerItem = gui.QSpacerItem(20,40, gui.QSizePolicy.Minimum, gui.QSizePolicy.Expanding)
        layout.addItem(spacerItem)
        cboxes.setWidget(w)
        self.addDockWidget(core.Qt.LeftDockWidgetArea, cboxes)

    def checkedBox(self,i):
        sender = self.sender()
        self.states[i] = 'open' if 'close' else 'close'
        # For debugging
        print i
        print self.states

如果我理解正确,我可以像往常一样在函数checkedBox 中启动阀门。

这是显示的内容 我希望能够单击一个复选框并将右侧的消息从closed 更改为open,反之亦然。

【问题讨论】:

  • 我希望在单击复选框时将 closed 更改为 open。当我单击它时,数组会发生变化,但不是正确的值。选中的任何框都会更改数组的i=2 值。任何取消选中的更改i=0

标签: python python-2.7 pyqt pyqt4


【解决方案1】:

问题的出现是因为 i 的默认值取的是信号发送的值(即状态:Unchecked = 0,PartiallyChecked = 1,Checked = 2),为了解决这个问题,我们将进一步添加函数的值:复选框的索引。此外,如果您想更改 QLabel 的文本,您必须能够访问它们,所以我创建了一个带有标签的新列表。为了进行更改,我们将使用状态列表,为此实现函数updateLabels

class ApplicationWindow(gui.QMainWindow):
    def __init__(self):
        self.nCheckBoxes=6
        self.states = ['closed']*self.nCheckBoxes

        gui.QMainWindow.__init__(self)
        self.setAttribute(core.Qt.WA_DeleteOnClose)
        self.setWindowTitle("PiView")
        self.file_menu = gui.QMenu('&File', self)
        #self.file_menu.addAction('&Quit', self.fileQuit, core.Qt.CTRL + core.Qt.Key_Q)
        self.menuBar().addMenu(self.file_menu)
        self.help_menu = gui.QMenu('&Help', self)
        self.menuBar().addSeparator()
        self.menuBar().addMenu(self.help_menu)
        #self.help_menu.addAction('&About', self.about)
        #self.help_menu.addAction('&Docs', self.doc)
        self.main_widget = gui.QWidget(self)

        l = gui.QVBoxLayout(self.main_widget)
        self.dc = MyMplCanvas(self.main_widget, width=5, height=4, dpi=100)
        l.addWidget(self.dc)

        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)

        self.dw = self.createDockWindows(self.dc)
        self.statusBar().showMessage("Initialized", 2000)

    def createDockWindows(self, MyMplCanvas):
        """
        Create all the dock widgets
        """
        self.drawValves()
        #self.drawGraphAdjustments()
        #self.drawStartAndStop()

    def drawValves(self):
        cboxes = gui.QDockWidget("Controls", self)
        cboxes.setAllowedAreas(core.Qt.LeftDockWidgetArea)
        w = gui.QWidget()
        #layout = gui.QVBoxLayout()
        layout = gui.QGridLayout()
        w.setLayout(layout)

        self.c = []
        self.l = []
        # Create self.nCheckBoxes
        msgBox = gui.QLabel()
        msgBox.setText("States")
        font = gui.QFont()
        font.setBold(True)
        msgBox.setFont(font)
        msgBox.setStyleSheet("color: rgb(255,0,0)")
        layout.addWidget(msgBox,0,1)
        for i in range(self.nCheckBoxes):
            checkBox = gui.QCheckBox("Valve " + str(i))
            checkBox.setChecked(False)
            checkBox.stateChanged.connect(lambda state, p=i: self.checkedBox(state, p))
            self.c.append(checkBox)

            layout.addWidget(self.c[i],i+1,0)
            msgBox = gui.QLabel()
            msgBox.setText(self.states[i])
            self.l.append(msgBox)
            layout.addWidget(msgBox,i+1,1)

        self.update_labels()

        spacerItem = gui.QSpacerItem(20,40, gui.QSizePolicy.Minimum, gui.QSizePolicy.Expanding)
        layout.addItem(spacerItem)
        cboxes.setWidget(w)
        self.addDockWidget(core.Qt.LeftDockWidgetArea, cboxes)

    def checkedBox(self, state, p):
        if state == core.Qt.Unchecked:
            self.states[p] = 'closed'
        else:
            self.states[p] = 'open'

        self.update_labels()

    def update_labels(self):
        for i in range(self.nCheckBoxes):
            if self.states[i] == 'closed':
                text = "closed"
                styleSheet = "color: rgb(255,0,0)"
            else:
                text = "open"
                styleSheet = "color: rgb(0,255,0)"
            self.l[i].setText(text)
            self.l[i].setStyleSheet(styleSheet)

【讨论】:

  • 谢谢!这确实有助于消除我一直以来的困惑。再次感谢昨天的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多