跟踪通过for循环生成的复选框的状态-PyQt5

问题描述 投票:0回答:1

我正在从MySQL查询中生成一系列复选框,该查询返回服务器上数据库的列表,并且由于无法为变量的名称分别分配变量而无法确定如何跟踪复选框的状态在列表的大小中。这可能吗?还是我需要采用其他方法来创建复选框本身?

默认情况下,复选框的生成状态为False,但是如果用户选择了复选框,则我需要存储该信息(特别是文本)以备将来使用。它们是在createGridLayout功能中生成的。

from PyQt5.QtWidgets import *
import sys

databases = []

# Randomly generated database names
for i in range(10):
    databases.append('db' + str(i))

db_count = len(databases)
row_num = 0

class App(QDialog):

    def __init__(self):
        super().__init__()
        self.title = 'MySQL Timing Discrepancies'
        self.left = 10
        self.top = 10
        self.width = 320
        self.height = 100
        self.initUI()

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

        self.createGridLayout()

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

        self.show()

    def createGridLayout(self):
        self.horizontalGroupBox = QGroupBox("Databases")
        layout = QGridLayout()
        layout.setColumnStretch(0, 0)
        layout.setColumnStretch(1, 0)
        layout.setColumnStretch(2, 0)

        # Generating checkboxes here
        for i in range(db_count):
            col_num = i % 3
            row_num = i if col_num == 0 else row_num
            cb = QCheckBox(databases[i])
            cb.setChecked(False)
            layout.addWidget(cb, row_num, col_num)

            # Does nothing because they are defaulted to False
            if cb.isChecked():
                print(cb.text())

        self.horizontalGroupBox.setLayout(layout)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())
python pyqt pyqt5
1个回答
0
投票
您可以使用列表来跟踪QCheckBox文本,方法是分别添加或删除(取决于已选中还是未选中)。要获取文本,您可以使用sender()方法,该方法返回发出信号的对象,在这种情况下,您必须使用stateChanged中的QCheckBox信号:

import sys from PyQt5.QtCore import pyqtSlot, Qt from PyQt5.QtWidgets import ( QApplication, QCheckBox, QDialog, QGridLayout, QGroupBox, QVBoxLayout, ) databases = ["db{}".format(i) for i in range(10)] class App(QDialog): def __init__(self): super().__init__() self.title = "MySQL Timing Discrepancies" self.left = 10 self.top = 10 self.width = 320 self.height = 100 self.initUI() def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) self._databases_checked = [] self.createGridLayout() windowLayout = QVBoxLayout(self) windowLayout.addWidget(self.horizontalGroupBox) self.show() @property def databases_checked(self): return self._databases_checked def createGridLayout(self): self.horizontalGroupBox = QGroupBox("Databases") layout = QGridLayout() self.horizontalGroupBox.setLayout(layout) for i in range(3): layout.setColumnStretch(i, 0) row_num = 0 # Generating checkboxes here for i, database in enumerate(databases): col_num = i % 3 row_num = i if col_num == 0 else row_num cb = QCheckBox(database) cb.setChecked(False) cb.stateChanged.connect(self.on_stateChanged) layout.addWidget(cb, row_num, col_num) @pyqtSlot(int) def on_stateChanged(self, state): checkbox = self.sender() text = checkbox.text() if state == Qt.Checked: self._databases_checked.append(text) else: self._databases_checked.remove(text) print(self.databases_checked) if __name__ == "__main__": app = QApplication(sys.argv) ex = App() sys.exit(app.exec_())

© www.soinside.com 2019 - 2024. All rights reserved.