Найти - Пользователи
Полная версия: Перерисовка QComboBox PySide\PyQt
Начало » GUI » Перерисовка QComboBox PySide\PyQt
1
Lestoroer
Всех приветствую.
Наблюдается такое явление один и тот же код в PyQt и PySide работает по-разному, при этом в PySide обнаружен баг (по всей видимости баг или может я туплю).
from PyQt5.Qt import QWidget, QApplication, QComboBox
#Создаем унаследованный класс от QComboBox
class CComboBox(QComboBox):
    #Переопределяем enterEvent -> когда наводится курсор на CComboBox, то он меняет цвета
    def enterEvent(self, event):
        #Задаем стиль по css
        self.setStyleSheet('QComboBox{background-color: rgb(0,200,255);\
                            selection-background-color: rgb(0,200,255);\
                            color: rgb(0,63,91);}')
    #Переопределяем leaveEvent -> когда отводится курсор от CComboBox, то он меняет цвета
    def leaveEvent(self, event):
        #Задаем стиль по css
        self.setStyleSheet('background-color: rgb(255,255,255);\
                            selection-background-color: rgb(0,80,91);\
                            color: rgb(0,63,91);')
class Table(QWidget):
    def __init__(self):
        super().__init__()
        self.window1()
    def window1 (self):
        self.setWindowTitle('Record')
        self.resize(339, 226)
        #Создаем объект класса CComboBox, который отображаем на QWidget
        self.toolBox = CComboBox(self)
        #Добавляем и пичкаем его инфой
        self.toolBox.addItem('Blue-Crisstal')
        self.toolBox.addItem('Black-White')
        self.toolBox.setFixedSize(120,20)
        self.toolBox.setCurrentIndex(0)
        #Стиль, который появлятся при запуске, далее уже определяется по enterEvent\leaveEvent
        self.toolBox.setStyleSheet('QComboBox{background-color: rgb(200,200,250);\
                                    selection-background-color: rgb(0,80,91);\
                                    color: rgb(0,63,91);}')
if __name__ == '__main__':
    import sys 
    app = QApplication(sys.argv) 
    window = Table() 
    window.show()
    sys.exit(app.exec_())  
Все отлично работает, PyQt - браво, никогда не “насилует” мозги.
Тот же код вставляем в PySide - как всегда, что-то не нравится ему.
Так вот сам процесс :
Когда мы наводим на ComboBox, то он меняет цвет -> далее нажимаем на него (тем самым раскрывая список) и обнажуриваем в PySide, что цвет выделения элементов выпадающего списка не изменился и остался стандартным (как в винде синим таким, можете стрелочками по списку походить). Тем самым, это наводит на мысль, что некорректно работает
 selection-background-color
в PySide.
Также можно заметить, что по-разному записан код в css стиле, где-то с QComboBox (в enterEvent):
('QComboBox{background-color: rgb(0,200,255);\
                            selection-background-color: rgb(0,200,255);\
                            color: rgb(0,63,91);}')
а где-то без него в (в leaveEvent):
('background-color: rgb(255,255,255);\
                            selection-background-color: rgb(0,80,91);\
                            color: rgb(0,63,91);')
Увы, только так работает, долго ковырялся и то, работает только в PyQt.
Желательно чтобы кто-нибудь тоже потестил этот код на PyQt и PySide
P.S. Очень сильно надо приглядеться к стилям css (я уже вдоль поперек как мог проглядел), возможно скобку не поправилам пайтона поставил или еще что, PySide обычно такие ошибки не пропускает. Уж очень эта проблема похожа лишь на то, что неправильно задан стиль
Lestoroer
Ладно, тогда такой вопрос :
Как узнать, когда выпадающий список QComboBox открыт? (пользователь нажал на него и список “вывалился”)
Если он открыт, то -> возвращается True (к примеру).
Я вроде и гуглил и сам думал, что-то не смог.
Добавлено через определенное время:
Непосильная задача оказалась
vic57
PySide ЕМНИП - Qt4, а PyQt5 - Qt5. разница в реализации есть. лучше используйте или то или другое
Lestoroer
vic57
PySide ЕМНИП - Qt4, а PyQt5 - Qt5. разница в реализации есть. лучше используйте или то или другое
Да использовал бы PyQt с радостью, однако, лицензирование запрещает свободное распространение, приходиться на этом PySide недоделанном сидеть.
Спасибо что осветили насчет того, что PySide - это Qt4, теперь понятно почему возникают такие разногласия.
vic57
Lestoroer
Да использовал бы PyQt с радостью, однако, лицензирование запрещает свободное распространение, приходиться на этом PySide недоделанном сидеть.
недоделанность есть как в PyQt, так и в PySide. Лучше вам изучать непосредственно Qt - доки и примеры отличные, сборка (QtCreator) расписана от и до.
http://download.qt.io/
Lestoroer
Уже решил проблему, благодарю всех, кто хотя бы хотел помочь.
Код к сожалению не смогу выложить, ибо там такой жесткий костыль получился, что черт ногу сломит (но если кому-то будет очень нужно, кину).
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB