Как удержать QComboBox от расширения последнего выбранного элемента с темой qdarkstyle - PullRequest
0 голосов
/ 12 июля 2019

У меня есть приложение Pyside2, использующее тему qdarkstyle . Я пытаюсь использовать виджет QComboBox, но выбранный элемент увеличивается до огромного размера, что делает виджет непригодным для использования.

Соответствующий код настройки пользовательского интерфейса, который я использовал для добавления поля со списком (созданного pyuic5) к созданию MainWindow, чтобы обеспечить воспроизводимый пример:

Примечание: для запуска этого кода вам понадобится тема qdarkstyle, а также PySide2, которую можно установить с помощью: pip install qdarkstyle

from PySide2 import QtCore, QtGui, QtWidgets
import qdarkstyle
import sys

class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(875, 527)
        self.comboBox = QtWidgets.QComboBox(Dialog)
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.retranslateUi(Dialog)
        self.comboBox.setCurrentIndex(4)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
        self.comboBox.setItemText(0, _translate("Dialog", "1 day"))
        self.comboBox.setItemText(1, _translate("Dialog", "1 week"))
        self.comboBox.setItemText(2, _translate("Dialog", "3 months"))
        self.comboBox.setItemText(3, _translate("Dialog", "6 months"))
        self.comboBox.setItemText(4, _translate("Dialog", "1 year"))
        self.comboBox.setItemText(5, _translate("Dialog", "3 years"))
        self.comboBox.setItemText(6, _translate("Dialog", "5 years"))
        self.comboBox.setItemText(7, _translate("Dialog", "max"))

class Dialog(QtWidgets.QDialog):
    def __init__(self):
        super(Dialog, self).__init__()
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Dialog()
    window.show()
    app.setStyleSheet(qdarkstyle.load_stylesheet_pyside2())
    sys.exit(app.exec_())

Когда я открываю поле со списком, последний выбранный элемент увеличивается в размере, как показано на рисунке ниже: blown up item in combobox

Я попытался вернуться к теме qt по умолчанию, и все работало нормально, поэтому я подозреваю, что это как-то связано с темой qdarkstyle, которую я использую. Любая помощь или советы с благодарностью!

1 Ответ

0 голосов
/ 12 июля 2019

Эта проблема, вероятно, связана с моей ОС или некоторыми другими системными настройками, поскольку это не похоже на обычную ошибку.

После того, как @eyllanesc попытался воспроизвести мой код, и у них все работало нормально, я представил проблему в репозитории qdarkstyle. Один из разработчиков ( @ goanpeca ) предложил добавить следующий код для решения проблемы:

from PySide2 import QtCore, QtGui, QtWidgets
...
    delegate = QtWidgets.QStyledItemDelegate()
    self.comboBox = QtWidgets.QComboBox(Dialog)
    self.comboBox.setItemDelegate(delegate)

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

Невскрытый:

Unopened Combobox

Открыт:

Opened Combobox

По словам разработчика, эта проблема будет рассмотрена, но предоставленное им исправление является значительным улучшением. Надеюсь, это поможет любому, кто может столкнуться с подобной проблемой! (кто-то с Manjaro в качестве своей ОС также наткнулся на эту ошибку, как подробно описано в этой проблеме для другого приложения qdarkstyle)

...