我正在编写一个简单的PyQt5应用程序,它使用QTableView小部件。我要做的是删除QTableView中聚焦项周围的虚线框。对于最小的工作示例,我使用以下代码:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, main_window):
main_window.setObjectName("main_window")
main_window.resize(640, 480)
self.main_container = QtWidgets.QWidget(main_window)
self.main_container.setObjectName("main_container")
self.verticalLayout = QtWidgets.QVBoxLayout(self.main_container)
self.verticalLayout.setObjectName("verticalLayout")
self.model = QtGui.QStandardItemModel(0, 2, main_window)
for col1, col2 in (("foo", "bar"), ("fizz", "buzz")):
it_col1 = QtGui.QStandardItem(col1)
it_col2 = QtGui.QStandardItem(col2)
self.model.appendRow([it_col1, it_col2])
self.view = QtWidgets.QTableView(
self.main_container, showGrid=False, selectionBehavior=QtWidgets.QAbstractItemView.SelectRows
)
self.view.setModel(self.model)
self.verticalLayout.addWidget(self.view)
main_window.setCentralWidget(self.main_container)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
它会产生以下结果(红色箭头显示要删除的框):
SO和Qt论坛上的不同主题建议将我的代码更改为:
# Previous code
self.view.setModel(self.model)
self.view.setStyleSheet(" QTableView::item:focus { outline: none } ") # also 0px was suggested
# OR
self.view.setModel(self.model)
self.view.setStyleSheet(" QTableView::item:focus { border: none } ") # also 0px was suggested
# OR
self.view.setModel(self.model)
self.view.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus)
# Further code
但这些方法都不适用于我:
-
outline: none这一方法几乎没有改变; -
border: none不仅保留盒子,还用白色填充物品; -
setFocusPolicy视觉效果最好,但使单元格不可编辑,并且通常对键盘事件没有响应(这是意料之中的,因为它们现在无法聚焦并接受事件)
所以我的问题是:这是否可能以某种方式移除或至少定制这个盒子?如果这很重要,我在Windows计算机上使用PyQt5==5.15.4,PyQt5-Qt5==5.15.2。