Python 3,最新版本的PyQt5(C ++ Answers是可以接受的) 使用通用QTableWidget
我使用带有QTableWidget的黑暗主题GUI,并且一直试图改变标题上排序箭头的外观,因为它们是深色。我似乎无法让他们正常工作。更改QHeaderView :: up-arrow的字体颜色不会影响任何内容。更改背景颜色会将其转换为指定颜色的小矩形,不带箭头。
Qt有一个关于如何在这里设置QHeaderView箭头样式的示例: http://doc.qt.io/qt-5/stylesheet-examples.html#customizing-qheaderview
当我像示例节目一样替换图像时,它看起来非常非常小。添加高度和宽度无效。
此外,我尝试使用" subcontrol-position:center right;""尝试将箭头移动到其他地方。正如我在其他例子中所见,没有效果。我真正想做的就是让箭头变成白色,并且可能略大于可见度的默认值。如果需要,我可以使用图像。能够选择移动箭头会很好,但我可以不用它。
如果您的解决方案涉及对QHeaderView进行子类化并覆盖绘制事件或处理代理,请举例说明该做什么,因为我不太熟悉这些主题。
编辑: 使用Qt Designer和图像的通用黑暗主题QTableWidget。 使用pyuic5转换为python。
main.py(运行此文件)
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'main.ui'
#
# Created by: PyQt5 UI code generator 5.6
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setStyleSheet("*{\n"
"background-color: #333;\n"
"color: white;\n"
"}\n"
"\n"
"QHeaderView:section{\n"
"background-color: rgba(255,255,255,50);\n"
"}\n"
"\n"
"QHeaderView:up-arrow{\n"
"image: url(:/arrow/up_arrow.png);\n"
"}")
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
self.tableWidget.setStyleSheet("")
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(2)
self.tableWidget.setRowCount(3)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(0, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(1, 1, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(2, 0, item)
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(2, 1, item)
self.tableWidget.verticalHeader().setVisible(False)
self.verticalLayout.addWidget(self.tableWidget)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.tableWidget.setSortingEnabled(True)
item = self.tableWidget.verticalHeaderItem(0)
item.setText(_translate("MainWindow", "New Row"))
item = self.tableWidget.verticalHeaderItem(1)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget.verticalHeaderItem(2)
item.setText(_translate("MainWindow", "3"))
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "New Column"))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "name"))
__sortingEnabled = self.tableWidget.isSortingEnabled()
self.tableWidget.setSortingEnabled(False)
item = self.tableWidget.item(0, 0)
item.setText(_translate("MainWindow", "1"))
item = self.tableWidget.item(0, 1)
item.setText(_translate("MainWindow", "bob"))
item = self.tableWidget.item(1, 0)
item.setText(_translate("MainWindow", "2"))
item = self.tableWidget.item(1, 1)
item.setText(_translate("MainWindow", "fred"))
item = self.tableWidget.item(2, 0)
item.setText(_translate("MainWindow", "3"))
item = self.tableWidget.item(2, 1)
item.setText(_translate("MainWindow", "george"))
self.tableWidget.setSortingEnabled(__sortingEnabled)
import Resources_rc
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_())
Qt资源文件包含使用pyrcc5转换为python的up_arrow.png图像。放在与main.py相同的目录中。
必须将以下内容命名为" Resources_rc.py":
# -*- coding: utf-8 -*-
# Resource object code
#
# Created by: The Resource Compiler for PyQt5 (Qt v5.6.2)
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore
qt_resource_data = b"\
\x00\x00\x00\x81\
\x89\
\x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\
\x00\x00\x18\x00\x00\x00\x18\x08\x04\x00\x00\x00\x4a\x7e\xf5\x73\
\x00\x00\x00\x48\x49\x44\x41\x54\x38\xcb\x63\x60\x18\x05\x83\x18\
\xfc\x6f\xf8\xdf\x40\x9a\x72\x10\x68\x20\x45\xf9\x1f\x20\x24\x4e\
\x0b\x58\xf9\xef\xff\x61\xff\xc3\x89\xd2\x02\x53\x0e\x66\x13\xd6\
\x02\x55\x1e\x0a\xe7\x13\xd2\x02\xd4\xf0\xfb\x7f\x08\x8a\x08\x48\
\x4b\x1d\x3e\x3b\xb4\x08\x8b\x8c\x82\xc1\x00\x00\xa1\x30\x49\xa2\
\x19\xa1\xab\xc2\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\
\
"
qt_resource_name = b"\
\x00\x05\
\x00\x68\x99\x67\
\x00\x61\
\x00\x72\x00\x72\x00\x6f\x00\x77\
\x00\x0c\
\x06\xe6\xe6\x67\
\x00\x75\
\x00\x70\x00\x5f\x00\x61\x00\x72\x00\x72\x00\x6f\x00\x77\x00\x2e\x00\x70\x00\x6e\x00\x67\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x10\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
"
def qInitResources():
QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
def qCleanupResources():
QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
qInitResources()
我也试过让QHeaderView的qss读取如下,将文本上方的箭头移动到文本右侧无效:
QHeaderView:up-arrow {
subcontrol-position: center right;
}