Python PyQt5 - QCheckbox для добавления и удаления itens из списка - PullRequest
0 голосов
/ 24 марта 2020

Я создаю пользовательский интерфейс с PyQt5 (и python 3.7), который я использую флажок, чтобы добавить элементы в общий список (input_columns_general), когда он установлен, и удалить / удалить, затем, когда не отмечен. Каждый раз, когда я устанавливаю флажок, добавленные элементы должны следовать порядку расположения по умолчанию в указанном списке c.

С этой задачей у меня две проблемы:

  1. Для каждого из имеющихся у меня флажков мне нужно создать функцию, которая будет вызывать отдельно Класс "isChecked ()" и соответствующий список, который я хочу добавить в "input_columns_general". В приведенном ниже коде я поместил все возможные ситуации:

  2. Когда я проверяю флажок, основная идея: связанный список получит соответствующий список (флажок "microreactor_checkbox" добавит для "input_columns_general" элементы в "input_columns_microreactor") однако он всегда должен быть в правильном положении общего. Например: «input_columns_microreactor» должен всегда быть первыми элементами, а «input_columns_mixer» должен быть после «input_columns_micrreactor» без учета того, какой из них был проверен первым. Каждая из требуемых позиций описывается в коде.

В приведенном ниже коде рассмотрите попытку, которая учитывает, как я могу добавлять и удалять элементы общего списка (но это не работает должным образом из-за того, что он не удаляет все нужные элементы в списке), и я не представлял, как мне всегда размещать в правильном положении новые элементы списка.

У кого-нибудь есть подсказка об этом деле?


from PyQt5 import QtCore, QtGui, QtWidgets

input_columns_general = []
input_columns_microreactor = ['a1', 'b1', 'c1', 'd1', 'e1']
input_columns_mixer = ['a2']
input_columns_mixture_process = ['a3', 'b3', 'c3', 'd3','e3', 'f3', 'g3', 'h3']
input_columns_reaction_process = ['a4', 'b4', 'c4', 'd4', 'e4']
input_columns_kinect_constants = ['a5', 'b5', 'c5', 'd5', 'e5', 'f5']
input_columns_chemical_species = ['a6', 'b6', 'c6', 'd6', 'e6',
                                  'f6', 'g6', 'h6', 'i6', 'j6', 'k6', 'l6']

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1386, 839)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QtCore.QRect(0, 0, 1361, 781))
        self.tabWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.tabWidget.setObjectName("tabWidget")

        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")

        self.tabWidget.addTab(self.tab, "")
        self.tab_2 = QtWidgets.QWidget()

        self.tab_2.setObjectName("tab_2")
        self.label = QtWidgets.QLabel(self.tab_2)
        self.label.setGeometry(QtCore.QRect(30, 90, 111, 21))

        font = QtGui.QFont()
        font.setPointSize(9)
        font.setBold(True)
        font.setWeight(75)

        self.label.setFont(font)
        self.label.setTextFormat(QtCore.Qt.PlainText)
        self.label.setObjectName("label")

        self.microreactor_checkbox = QtWidgets.QCheckBox(self.tab_2)
        self.microreactor_checkbox.setGeometry(QtCore.QRect(30, 130, 101, 21))
        self.microreactor_checkbox.setObjectName("microreactor_checkbox")
        self.microreactor_checkbox.stateChanged.connect(lambda: self.state_changed_microreactor(self.microreactor_checkbox))

        self.mixer_checkbox = QtWidgets.QCheckBox(self.tab_2)
        self.mixer_checkbox.setGeometry(QtCore.QRect(160, 130, 71, 21))
        self.mixer_checkbox.setObjectName("mixer_checkbox")
        self.mixer_checkbox.stateChanged.connect(lambda: self.state_changed_mixer(self.mixer_checkbox))

        self.mixture_process_checkbox = QtWidgets.QCheckBox(self.tab_2)
        self.mixture_process_checkbox.setGeometry(QtCore.QRect(270, 130, 121, 21))
        self.mixture_process_checkbox.setObjectName("mixture_process_checkbox")
        self.mixture_process_checkbox.stateChanged.connect(lambda: self.state_changed_mixture_process(self.mixture_process_checkbox))

        self.reaction_process_checkbox = QtWidgets.QCheckBox(self.tab_2)
        self.reaction_process_checkbox.setGeometry(QtCore.QRect(420, 130, 131, 21))
        self.reaction_process_checkbox.setObjectName("reaction_process_checkbox")
        self.reaction_process_checkbox.stateChanged.connect(lambda: self.state_changed_reaction_process(self.reaction_process_checkbox))
        self.input_table =  QtWidgets.QTableWidget(self.tab_2)
        self.input_table.setGeometry(QtCore.QRect(20, 370, 1261, 371))
        self.input_table.setObjectName("input_table")

        self.input_table.setColumnCount(10)
        self.input_table.setRowCount(10)

        # self.createTableElements(input_table)
        # item = QtWidgets.QTableWidgetItem()

        self.tabWidget.addTab(self.tab_2, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.tabWidget.addTab(self.tab_3, "")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1386, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

        self.retranslateUi(MainWindow)
        self.tabWidget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def state_changed_microreactor(self, int):
        if self.microreactor_checkbox.isChecked():
            input_columns_general[0:4] = input_columns_microreactor
            print(input_columns_general)
        else:
            for element in input_columns_microreactor:
                input_columns_general.remove(element)
                print(input_columns_general)

    def state_changed_mixer(self, int):
        if self.mixer_checkbox.isChecked():
            input_columns_general[4:5] = input_columns_mixer
            print(input_columns_general)
        else:
            for element in input_columns_mixer:
                input_columns_general.remove(element)
            print(input_columns_general)

    def state_changed_mixture_process(self, int):
        if self.mixture_process_checkbox.isChecked():
            input_columns_general[5:12] = input_columns_mixture_process
            print(input_columns_general)
        else:
            for element in input_columns_mixture_process:
                input_columns_general.remove(element)
            print(input_columns_general)

    def state_changed_reaction_process(self, int):
        if self.reaction_process_checkbox.isChecked():
            input_columns_general[12:23] = input_columns_reaction_process
            print(input_columns_general)
        else:
            for element in input_columns_reaction_process:
                input_columns_general.remove(element)
            print(input_columns_general)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Main"))
        self.label.setText(_translate("MainWindow", "Type of Data"))
        self.microreactor_checkbox.setText(_translate("MainWindow", "Microreactor"))
        self.mixer_checkbox.setText(_translate("MainWindow", "Mixer"))
        self.mixture_process_checkbox.setText(_translate("MainWindow", "Mixture Process"))
        self.reaction_process_checkbox.setText(_translate("MainWindow", "Reaction Process"))

        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Insert Data"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Load Data"))

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

1 Ответ

1 голос
/ 24 марта 2020

Прежде всего, рекомендуется не изменять класс, сгенерированный Qt Designer, поэтому вы должны сгенерировать файл и предположить, что он называется mainwindow.py: pyuic5 your_file.ui -o mainwindow.py -x.

Возвращаясь к проблеме, поскольку каждый раз, когда изменяется QCheckBox, результат будет регенерирован, поэтому список можно создавать, повторяя и проверяя состояние QCheckBox, добавляя его или не добавляя в зависимости от каждого случая.

main.py

from PyQt5 import QtCore, QtGui, QtWidgets

from mainwindow import Ui_MainWindow


input_columns_microreactor = ["a1", "b1", "c1", "d1", "e1"]
input_columns_mixer = ["a2"]
input_columns_mixture_process = ["a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3"]
input_columns_reaction_process = ["a4", "b4", "c4", "d4", "e4"]


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

        for checkbox in (
            self.microreactor_checkbox,
            self.mixer_checkbox,
            self.mixture_process_checkbox,
            self.reaction_process_checkbox,
        ):
            checkbox.stateChanged.connect(self.update_input_columns_general)

    @QtCore.pyqtSlot()
    def update_input_columns_general(self):
        input_columns_general = []

        checkboxes = (
            self.microreactor_checkbox,
            self.mixer_checkbox,
            self.mixture_process_checkbox,
            self.reaction_process_checkbox,
        )

        input_columns = (
            input_columns_microreactor,
            input_columns_microreactor,
            input_columns_mixture_process,
            input_columns_reaction_process,
        )

        for checkbox, columns in zip(checkboxes, input_columns):
            if checkbox.isChecked():
                input_columns_general.extend(columns)
        print(input_columns_general)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...