PyQt5 QHeaderView:: не работают стили со стрелками вверх

Python 3, самая последняя версия PyQt5 (ответы на C++ приемлемы) с использованием универсального QTableWidget

Я использую темный графический интерфейс с QTableWidget и пытаюсь изменить внешний вид стрелок сортировки на заголовках, так как они темного цвета. Я не могу заставить их работать должным образом. Изменение цвета шрифта для QHeaderView::up-arrow ни на что не влияет. Изменение цвета фона преобразует его в небольшой прямоугольник указанного цвета без стрелок.

Qt имеет пример того, как стилизовать стрелки QHeaderView здесь: http://doc.qt.io/qt-5/stylesheet-examples.html

Когда я заменяю изображение, как показано в примере, оно кажется очень маленьким. Добавление высоты и ширины ничего не делает.

Кроме того, я попытался переместить стрелку в другие места, используя "subcontrol-position: center right"; как я видел в других примерах, безрезультатно. Все, что я действительно хочу сделать, это сделать стрелку белой и, возможно, немного больше, чем значение по умолчанию для видимости. Я могу использовать изображение, если это необходимо. Было бы неплохо иметь возможность перемещать стрелку, но я могу жить без этого.

Если ваше решение включает создание подкласса QHeaderView и перезапись события рисования или работу с прокси, приведите примеры того, что делать, поскольку я не очень знаком с этими темами.

Редактировать: Общий темный тематический QTableWidget, используя Qt Designer с изображением. Преобразован в python с использованием pyuic5.

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 Resource, содержащий изображение up_arrow.png, преобразованное в python с использованием pyrcc5. Поместите в тот же каталог, что и 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()

Я также попытался сделать qss для QHeaderView следующим образом, чтобы переместить стрелку сверху текста справа от текста безрезультатно:

QHeaderView:up-arrow {
subcontrol-position: center right;
}

0 ответов

Другие вопросы по тегам