In QtListWidgetItem RadioButton/Checkbox in QtListwidget einbauen das nur ein Item aktiv geschaltet werden kann.

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
McAce
User
Beiträge: 32
Registriert: Dienstag 20. April 2010, 14:01

Hallo Zusammen,

ich versuche in eine QtListWidget mit einem QtListItem das ListItem mit einem RadioButton bzw. einen Trigger an die checkbox der bei Änderung des Status eine Function aufruft.
Ziel ist es das nur eine Checkbox/Radiobutton in dem QTListWidget anklickbar ist.

Das funktioniert leider nicht über über die Funktion item_clicked da die darauf reagiert welches Item ich anklicke unabhängig vom Status der Checkbox.

Hat da jemand eine Idee?

Mir ist das Egal ob es ein QtListWidgetItem ist, es kann auch was anderes sein, Hauptsache es kann nur ein Element aktiv geschaltet werden.

Den Code für die GUI habe ich im QTDesigner erstellt.

Code: Alles auswählen

import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QMainWindow, QApplication, QListWidgetItem, QTableWidgetItem
# from libs.pyqt.base_gui.multi_config_main import Ui_MainWindow
from libs.pyqt.base_gui.tab_test import Ui_MainWindow


class MainWindow(QMainWindow, Ui_MainWindow):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.show()

        # self.usb_port = self.usb_port_txt.text()
        # self.feeder_amount = self.feeder_amount_txt.text()


        # self.refill_btn.pressed.connect(self.refill)
        # self.send_btn.pressed.connect(self.send)

        self.value = 'empty'

        self.fill_list_btn.pressed.connect(self.fill_list)

        self.test_list = [e for e in range(0,10)]

    def refill(self):

        print("refill")

    def send(self):
        print(self.usb_port)
        print(self.feeder_amount)

        print("send")

    def fill_list(self):

        if self.listWidget.count() < 10:
            for e in self.test_list:
                item = QListWidgetItem(str(e))
                item.setFlags(item.flags() | Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
                # item.setText("w")
                item.setCheckState(False)

                self.listWidget.addItem(item)

            self.listWidget.itemClicked.connect(self.item_clicked)


        # if self.listWidget.currentItem() is not None:
        #     print(f"{self.listWidget.currentItem().text()=}")
        # print(f"{self.listWidget.currentRow()=}")



    def item_clicked(self):
        if self.listWidget.currentItem() is not None:
            print(f"{self.listWidget.currentItem().text()=}")
        print(f"{self.listWidget.currentRow()=}")

    def check_box_clicked(self):
        print("checkbox clicked")


app = QApplication(sys.argv)
w = MainWindow()
app.exec_()

Code: Alles auswählen

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'tab_test.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(820, 609)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
        self.tabWidget.setSizePolicy(sizePolicy)
        self.tabWidget.setObjectName("tabWidget")
        self.multi_config_tab = QtWidgets.QWidget()
        self.multi_config_tab.setObjectName("multi_config_tab")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.multi_config_tab)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.formLayout = QtWidgets.QFormLayout()
        self.formLayout.setObjectName("formLayout")
        self.usb_port_label = QtWidgets.QLabel(self.multi_config_tab)
        self.usb_port_label.setObjectName("usb_port_label")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.usb_port_label)
        self.usb_port_txt = QtWidgets.QLineEdit(self.multi_config_tab)
        self.usb_port_txt.setObjectName("usb_port_txt")
        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.usb_port_txt)
        self.feeder_amount_label = QtWidgets.QLabel(self.multi_config_tab)
        self.feeder_amount_label.setObjectName("feeder_amount_label")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.feeder_amount_label)
        self.feeder_amount_txt = QtWidgets.QLineEdit(self.multi_config_tab)
        self.feeder_amount_txt.setObjectName("feeder_amount_txt")
        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.feeder_amount_txt)
        self.feeder_type_label = QtWidgets.QLabel(self.multi_config_tab)
        self.feeder_type_label.setObjectName("feeder_type_label")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.feeder_type_label)
        self.comboBox = QtWidgets.QComboBox(self.multi_config_tab)
        self.comboBox.setObjectName("comboBox")
        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.comboBox)
        self.simulation_label = QtWidgets.QLabel(self.multi_config_tab)
        self.simulation_label.setObjectName("simulation_label")
        self.formLayout.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.simulation_label)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.simulation_on = QtWidgets.QRadioButton(self.multi_config_tab)
        self.simulation_on.setObjectName("simulation_on")
        self.horizontalLayout.addWidget(self.simulation_on)
        self.simulation_off = QtWidgets.QRadioButton(self.multi_config_tab)
        self.simulation_off.setChecked(True)
        self.simulation_off.setObjectName("simulation_off")
        self.horizontalLayout.addWidget(self.simulation_off)
        self.formLayout.setLayout(3, QtWidgets.QFormLayout.FieldRole, self.horizontalLayout)
        self.refill_btn = QtWidgets.QPushButton(self.multi_config_tab)
        self.refill_btn.setObjectName("refill_btn")
        self.formLayout.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.refill_btn)
        self.send_btn = QtWidgets.QPushButton(self.multi_config_tab)
        self.send_btn.setObjectName("send_btn")
        self.formLayout.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.send_btn)
        self.verticalLayout_2.addLayout(self.formLayout)
        self.tabWidget.addTab(self.multi_config_tab, "")
        self.id_2_ip_tab = QtWidgets.QWidget()
        self.id_2_ip_tab.setObjectName("id_2_ip_tab")
        self.fill_list_btn = QtWidgets.QPushButton(self.id_2_ip_tab)
        self.fill_list_btn.setGeometry(QtCore.QRect(150, 450, 89, 25))
        self.fill_list_btn.setObjectName("fill_list_btn")
        self.listWidget = QtWidgets.QListWidget(self.id_2_ip_tab)
        self.listWidget.setGeometry(QtCore.QRect(20, 20, 256, 351))
        self.listWidget.setObjectName("listWidget")
        self.tabWidget.addTab(self.id_2_ip_tab, "")
        self.verticalLayout.addWidget(self.tabWidget)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 820, 22))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.usb_port_label.setText(_translate("MainWindow", "USB Port"))
        self.usb_port_txt.setText(_translate("MainWindow", "/dev/ttyUSB0"))
        self.feeder_amount_label.setText(_translate("MainWindow", "Anzahl Waagen"))
        self.feeder_amount_txt.setText(_translate("MainWindow", "1"))
        self.feeder_type_label.setText(_translate("MainWindow", "Waagen Typ"))
        self.simulation_label.setText(_translate("MainWindow", "Simulation"))
        self.simulation_on.setText(_translate("MainWindow", "an"))
        self.simulation_off.setText(_translate("MainWindow", "aus"))
        self.refill_btn.setText(_translate("MainWindow", "Befüllen"))
        self.send_btn.setText(_translate("MainWindow", "Senden"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.multi_config_tab), _translate("MainWindow", "MultiConfig"))
        self.fill_list_btn.setText(_translate("MainWindow", "fill list"))
        self.listWidget.setSortingEnabled(False)
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.id_2_ip_tab), _translate("MainWindow", "Id 2 IP"))
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also Radiobuttons bekommst Du beispielsweise so in die Liste:

Code: Alles auswählen

def fill_list(self):
        if self.listWidget.count() < 10:
            for e in self.test_list:
                item = QListWidgetItem(self.listWidget)
                self.listWidget.setItemWidget(item, QRadioButton(str(e)))
Vielleicht hilft Dir das ja schon weiter. Wenn Du auf Veränderung reagieren willst, müsstest Du entweder ein entsprechendes Signal auf jedem `QRadioButton`-Objekt verbinden, beispielsweise `pressed()` oder `toggled()`, oder die alle in eine `QButtonGroup` stecken und dort ein entsprechendes Signal abgreifen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
McAce
User
Beiträge: 32
Registriert: Dienstag 20. April 2010, 14:01

Danke für den Hinweis sowas hatte ich gesucht.
Antworten