Установить фон выбора отключенного флажка в pyqt5 - PullRequest
2 голосов
/ 28 июня 2019

У меня есть флажок, который отключен (пользователь не должен иметь возможность его переключать), но у меня возникают проблемы при изменении его фона при выборе. Я уверен, что это связано с тем, что коробка отключена, но я не уверен, как это исправить. Если есть простое исправление с помощью таблиц стилей, это было бы идеально.

Я пытался возиться со слотами / сигналами, но это вызывало странные проблемы, и я бы не стал так решать эту проблему

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import (QApplication,
          QTableView, QAbstractItemView)



class Ui_MainWindow(object):
   def setupUi(self, MainWindow):
       MainWindow.setObjectName("MainWindow")
       MainWindow.resize(400, 300)
       self.centralwidget = QtWidgets.QWidget(MainWindow)
       self.centralwidget.setObjectName("centralwidget")
       MainWindow.setCentralWidget(self.centralwidget)

       self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
       self.tableWidget.setGeometry(QtCore.QRect(50, 40, 310, 50))
       self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
       self.tableWidget.setSelectionMode(QAbstractItemView. 
          SingleSelection)
       self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
       self.tableWidget.verticalHeader().setVisible(False)
       self.tableWidget.horizontalHeader().setVisible(False)
       self.tableWidget.setShowGrid(False)
       self.tableWidget.setStyleSheet("background-color: white; selection-background-color: #353535;")

       self.tableWidget.insertRow(0)

       self.tableWidget.insertColumn(0)
       self.tableWidget.insertColumn(1)
       self.tableWidget.insertColumn(2)


       self.tableWidget.checkBox = QtWidgets.QCheckBox(self.tableWidget)

       self.tableWidget.checkBox.setAttribute(QtCore.Qt.WA_TransparentForMouseEvents)
       self.tableWidget.checkBox.setFocusPolicy(QtCore.Qt.NoFocus)
       self.tableWidget.checkBox.setMaximumSize(30, 30)
       self.tableWidget.checkBox.setStyleSheet("background-color: white; selection-background-color: #353535; padding-left: 10px")
       self.tableWidget.checkBox.setChecked(True)


       self.tableWidget.setCellWidget(0, 1, self.tableWidget.checkBox)




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 Ответ

3 голосов
/ 02 июля 2019

Проблема в вашем случае в том, что выбранный QCheckBox должен иметь фокус, но вы его отключили, и в соответствии с тем, что вы утверждаете в своих комментариях, я думаю, что у вас проблема XY : Ваша нижняя проблема состоит в том, чтобы иметь выбор для каждой строки и включить изменение статуса флажка в зависимости от данных, которые имеет QTableWidget.

Учитывая вышеизложенное, нет необходимости использовать QCheckBox, достаточно обширный, чтобы включитьустановите флажок Qt :: ItemIsUserCheckable и используйте делегат, чтобы включить или отключить изменение состояния флажка.

Учитывая вышеизложенное, решение является следующим:

import random
from enum import Flag
from PyQt5 import QtCore, QtGui, QtWidgets


PermissionsRole = QtCore.Qt.UserRole + 1000


class Permissions(Flag):
    User = 0
    Admin = 1 << 0


class CheckBoxDelegate(QtWidgets.QStyledItemDelegate):
    def editorEvent(self, event, model, option, index):
        if index.data(PermissionsRole) & Permissions.Admin:
            super(CheckBoxDelegate, self).editorEvent(
                event, model, option, index
            )
        return False


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

        self.m_tablewidget = QtWidgets.QTableWidget(
            selectionBehavior=QtWidgets.QAbstractItemView.SelectRows,
            selectionMode=QtWidgets.QAbstractItemView.SingleSelection,
            editTriggers=QtWidgets.QAbstractItemView.NoEditTriggers,
            showGrid=False,
            columnCount=3,
        )
        delegate = CheckBoxDelegate(self.m_tablewidget)
        self.m_tablewidget.setItemDelegateForColumn(1, delegate)
        self.m_tablewidget.setStyleSheet(
            """
            QTableView
            {
                background-color: white; 
                selection-background-color: #353535;
            }
            """
        )
        for header in (
            self.m_tablewidget.horizontalHeader(),
            self.m_tablewidget.verticalHeader(),
        ):
            header.hide()
            if header.orientation() == QtCore.Qt.Horizontal:
                header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)

        for i in range(10):
            isAdmin = random.choice([Permissions.User, Permissions.Admin])
            self.m_tablewidget.insertRow(self.m_tablewidget.rowCount())
            self.m_tablewidget.setItem(
                i,
                0,
                QtWidgets.QTableWidgetItem(
                    "Is Admin?: {}".format(isAdmin == Permissions.Admin)
                ),
            )

            it = QtWidgets.QTableWidgetItem()
            it.setData(PermissionsRole, isAdmin)
            it.setFlags(it.flags() | QtCore.Qt.ItemIsUserCheckable)
            it.setCheckState(QtCore.Qt.Checked)
            self.m_tablewidget.setItem(i, 1, it)

        self.setCentralWidget(self.m_tablewidget)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())
...