【问题标题】:Set selection background of disabled checkbox in pyqt5在pyqt5中设置禁用复选框的选择背景
【发布时间】:2019-11-10 18:37:55
【问题描述】:

我有一个被禁用的复选框(用户应该无法切换它),但我在选择它时无法更改它的背景。我确信这与盒子被禁用的事实有关,但我不知道如何修复它。如果有一个简单的样式表修复将是理想的。

我尝试弄乱插槽/信号,但这会导致奇怪的问题,我不想那样解决这个问题

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_())

【问题讨论】:

  • 我不懂你,你自己解释清楚
  • 如果您运行当前代码并选择该行,您会看到整行将背景颜色更改为灰色,但复选框周围的区域不会更改背景颜色,它仍然是白色。我想修改它,以便在选择行时,整个复选框后台区域变为灰色。 span>
  • 为什么禁用 QCheckBox 的焦点?
  • 因为我不希望用户能够用它做任何事情。在实际项目中,根据用户权限检查复选框

标签: python pyqt pyqt5 qtablewidget


【解决方案1】:

在您的情况下,问题是要选择的 QCheckBox 必须具有焦点,但是您已将其禁用,根据您在 cmets 中的争论,我认为您有一个XY problem:您的根本问题是根据 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_())

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多