PyQt5 QHeaderView ::向上箭头样式不起作用

时间:2018-03-09 01:16:34

标签: python-3.x qt qt5 pyqt5 qtstylesheets

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;
}

0 个答案:

没有答案