Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
PyQt5

Как изменить стиль CheckBox в ComboBox (CheckableComboBox)

28.01.2023, 22:26. Показов 3270. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть ComboBox с возможностью выбора нескольких элементов. Я хотел бы изменить стиль самого CheckBox в ComboBox. У меня есть стиль для обычного CheckBox, но как мне его применить к ComboBox



Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import sys
import typing
 
import PyQt5
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import QEvent
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem
 
 
class MyCheckableComboBox(QtWidgets.QComboBox):
    def __init__(self):
        super().__init__()
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        self.closeOnLineEditClick = False
 
        self.model().dataChanged.connect(self.updateCheck)
        self.addItems('abcde')
        self.lineEdit().setText('Выберите что-то')
 
    def addItem(self, text, userData=None):
        item = QStandardItem()
        item.setText(text)
        if userData is None:
            item.setData(userData)
        item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
        item.setData(Qt.Unchecked, Qt.CheckStateRole)
        self.model().appendRow(item)
 
    def addItems(self, items: typing.Iterable[str]) -> None:    # зачем None?
        for item in items:
            self.addItem(item)
 
    def itemChecked(self, index):
        item = self.model().item(index, 0)
        print(index, item.checkState())
        return item.checkState() == QtCore.Qt.Checked
 
 
 
    def updateCheck(self, index):
        # PyQt5.QtCore.QModelIndex.row()
        row = index.row()
        if self.model().item(row).checkState() == Qt.Checked:
            print('выбрано', self.model().item(row).text())
        elif self.model().item(row).checkState() == Qt.Unchecked:
            print('не выбрано', self.model().item(row).text())
 
        textChecked = []
        for i in range(self.model().rowCount()):
            if self.model().item(i).checkState() == Qt.Checked:
                textChecked.append(self.model().item(i).text())
        self.lineEdit().setText(', '.join(textChecked))
 
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.init_gui()
 
    def init_gui(self):
        self.window = QtWidgets.QWidget()
        self.layout = QtWidgets.QGridLayout()
        self.setCentralWidget(self.window)
        self.window.setLayout(self.layout)
 
        self.layout.addWidget(QtWidgets.QCheckBox('check'))
        self.checkComboBox = MyCheckableComboBox()
        self.layout.addWidget(self.checkComboBox)
 
if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    app.setStyleSheet("""  
    QCheckBox
    {
        spacing: 5px;
        outline: none;
        margin-bottom: 2px;
    }
    QCheckBox::indicator
    {
        width: 18px;
        height: 18px;
    }
    QCheckBox::indicator:unchecked
    {
        image: url(Dark_rc/checkbox_unchecked.png);
    }
    QCheckBox::indicator:checked
    {
        image: url(Dark_rc/checkbox_checked.png);
    }
""")
    win = MainWindow()
    win.show()
 
    sys.exit(app.exec_())
Миниатюры
Как изменить стиль CheckBox в ComboBox (CheckableComboBox)  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.01.2023, 22:26
Ответы с готовыми решениями:

Как изменить стиль флажка CheckBox?
Нужно изменить checkBox под стиль который ниже. (нажатый и включенный) Почему не радиобаттен (у меня в листбок) должно находится куча...

Как изменить стиль при выборе checkbox и нажатии кнопки
Добрый день. Написал код, который должен после выбора checkbox и нажатии на input менять цвет дива на красный. К сожалению, код не...

Изменить стиль CheckBox
Всем привет! Я хочу изменить стиль переключателя Checkbox. Я знаю что это возможно, но не знаю как именно. Помогите, если кто нибудь уже...

33
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
29.01.2023, 10:32
в QComboBox нет CheckBox отдельно, есть QListView/QListModel
свою модель делать или через делегат
https://russianblogs.com/article/7388794016/
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
29.01.2023, 14:19  [ТС]
vic5710, я понял что для QComboBox нужно установить свой делегат и уже в делегате изменить стиль. Но не понял, как именно его изменить. Нашел только изменение заднего фона, а мне нужно поставить свои изображения при checked и unchecked.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import sys
import typing
 
import PyQt5
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import QEvent
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem
from PyQt5.QtWidgets import QStyledItemDelegate
 
 
 
class AlignDelegate(QtWidgets.QStyledItemDelegate):
    def initStyleOption(self, option: 'QStyleOptionViewItem', index: QtCore.QModelIndex) -> None:
        super(AlignDelegate, self).initStyleOption(option, index)
        option.backgroundBrush = QtGui.QBrush(QtGui.QColor("green"))
        # option.displayAlignment = QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter
        # option.checkState.Checked.
 
class MyCheckableComboBox(QtWidgets.QComboBox):
    def __init__(self):
        super().__init__()
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        self.closeOnLineEditClick = False
 
        self.model().dataChanged.connect(self.updateCheck)
        self.addItems('abcde')
        self.lineEdit().setText('Выберите что-то')
        self.setItemDelegate(AlignDelegate())
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
29.01.2023, 15:30
как то так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from PyQt5 import Qt
 
class Delegate(Qt.QItemDelegate):
    def __init__(self,parent=None):
        super().__init__()
        self.parent = parent
        
    def paint(self, painter, option, index):
        row = index.row()
        if row == self.parent.currentIndex():
            w = self.parent.view().size().width()
            h = self.parent.view().size().height()/self.parent.count()
            painter.fillRect(1,row*h,h,h,Qt.QColor(255,255,0,127))
            option.rect.moveTopLeft(Qt.QPoint(h,row*h))
        super(Delegate, self).paint(painter, option, index)
 
app = Qt.QApplication([])
box = Qt.QComboBox()
box.addItems(list('qwerty'))
d = Delegate(box)
box.setItemDelegate(d)
box.resize(100,40)
box.show()
app.exec()
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
29.01.2023, 16:04  [ТС]
vic5710, при открытии ComboBox вылетает на 13 строчке. И мне нужно не просто закрасить, а вставить свои изображения при checked и unchecked.
Изображения
  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
29.01.2023, 16:19
УМВР
painter.drawPixmap
http://it.kgsu.ru/Python_Qt/pyqt5_190.html

Добавлено через 9 минут
вы можете setItemIcon использовать ИМХО проще будет
http://it.kgsu.ru/Python_Qt/pyqt5_132.html
1
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
29.01.2023, 16:21  [ТС]
Спасибо, попробую
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 08:41
нашел как настроить ComboBox через qss
Python
1
2
3
4
5
6
7
8
9
10
11
style_sheet =
'''
QComboBox::indicator:checked {
    /*background-color:#f00;*/
    image: url(check.png)
}
QComboBox::indicator:unchecked {
    /*background-color:#0f0;*/
    image: url(uncheck.jpg)
}
'''
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 10:01  [ТС]
vic5710,
Цитата Сообщение от vic5710 Посмотреть сообщение
нашел как настроить ComboBox через qss
к сожалению не работает
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 10:05
Цитата Сообщение от DarkShaddow Посмотреть сообщение
к сожалению не работает
УМВР

Не по теме:

что-то все у вас не работает
текст ошибки какой?

0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 10:12  [ТС]
vic5710, я собственно стиль применил этот, но он просто не применился. Ошибки никакой нет
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import sys
import typing
 
from PyQt5.Qt import QItemDelegate
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItem
 
 
 
class MyCheckableComboBox(QtWidgets.QComboBox):
    def __init__(self):
        super().__init__()
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        self.closeOnLineEditClick = False
 
        self.model().dataChanged.connect(self.updateCheck)
        self.addItems('abcde')
        self.lineEdit().setText('Выберите что-то')
 
    def addItem(self, text, userData=None):
        item = QStandardItem()
        item.setText(text)
        if userData is None:
            item.setData(userData)
        item.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
        item.setData(Qt.Unchecked, Qt.CheckStateRole)
        self.model().appendRow(item)
 
    def addItems(self, items: typing.Iterable[str]) -> None:  # зачем None?
        for item in items:
            self.addItem(item)
 
    def itemChecked(self, index):
        item = self.model().item(index, 0)
        print(index, item.checkState())
        return item.checkState() == QtCore.Qt.Checked
 
    def updateCheck(self, index):
        # PyQt5.QtCore.QModelIndex.row()
        row = index.row()
        if self.model().item(row).checkState() == Qt.Checked:
            print('выбрано', self.model().item(row).text())
        elif self.model().item(row).checkState() == Qt.Unchecked:
            print('не выбрано', self.model().item(row).text())
 
        textChecked = []
        for i in range(self.model().rowCount()):
            if self.model().item(i).checkState() == Qt.Checked:
                textChecked.append(self.model().item(i).text())
        self.lineEdit().setText(', '.join(textChecked))
 
 
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.init_gui()
 
    def init_gui(self):
        self.window = QtWidgets.QWidget()
        self.layout = QtWidgets.QGridLayout()
        self.setCentralWidget(self.window)
        self.window.setLayout(self.layout)
 
        self.layout.addWidget(QtWidgets.QCheckBox('check'))
        self.checkComboBox = MyCheckableComboBox()
        self.layout.addWidget(self.checkComboBox)
 
 
if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    app.setStyleSheet("""  
    QComboBox
    {
        spacing: 5px;
        outline: none;
        margin-bottom: 2px;
    }
    QComboBox::indicator
    {
        width: 18px;
        height: 18px;
    }
    QComboBox::indicator:unchecked
    {
        image: url(Dark_rc/checkbox_unchecked.png);
    }
    QComboBox::indicator:checked
    {
        image: url(Dark_rc/checkbox_checked.png);
    }
""")
    win = MainWindow()
    win.show()
 
    sys.exit(app.exec_())
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 10:23  [ТС]
vic5710, кстати нарисовать то в ComboBox изображение я смог, но надо еще понять как стереть и раздвинуть эти квадратики. Но не уж то нет способа лучше нежели вручную прописывать код для отрисовки изображения?
Миниатюры
Как изменить стиль CheckBox в ComboBox (CheckableComboBox)  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 10:42
тут painter применяется ко всему окну, а не к строке
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from PyQt5 import Qt
 
class Delegate(Qt.QItemDelegate):
    def __init__(self,parent=None):
        super().__init__()
        self.parent = parent
 
    def paint(self, painter, option, index):
        row = index.row()
        h = self.parent.view().size().height()/self.parent.count()
        pix = Qt.QPixmap(h-2,h-2)
        if self.parent._checklist[row]: 
            pix.fill(Qt.Qt.red)
        else: 
            pix.fill(Qt.Qt.green)
        painter.drawPixmap(1,row*h,pix)
        option.rect.moveTopLeft(Qt.QPoint(h,row*h))
        super(Delegate, self).paint(painter, option, index)
        
class ComboBox(Qt.QComboBox):
    def __init__(self,parent=None):
        super().__init__()
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        self.setItemDelegate(Delegate(self))
        self.activated.connect(self.on_activated)        
    
    def on_activated(self,idx):
        self._checklist[idx] ^= True
        s =','.join([self.itemText(i) for i in range(self.count()) if self._checklist[i]])
        self.lineEdit().setText(s)
        
    def addItems(self,lst):
        self._checklist = [False]*len(lst)
        super(ComboBox,self).addItems(lst)
        self.lineEdit().clear()
        
if __name__=="__main__":
    app = Qt.QApplication([])
    box = ComboBox()
    box.addItems(list('qwerty'))
    box.setFont(Qt.QFont('times',18))
    box.resize(100,32)
    box.show()
    app.exec()
у меня стиль применился
Миниатюры
Как изменить стиль CheckBox в ComboBox (CheckableComboBox)  
1
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 10:49
вангую работать такой виджет будет криво
вы делаете QComboBox.setEditable(True), а при этом он начинает хранить историю изменений и где она - не поймешь
лучше с нуля напишите - QLineEdit, QToolButton, QLictView/QAbstractListModel всего-то
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 11:50  [ТС]
Цитата Сообщение от vic5710 Посмотреть сообщение
у меня стиль применился
Странно, что у вас применяется. Можете запустить мой код выше у себя? И какая у вас ОС, может дело в этом?
И ваш код у меня не работает. При открытии qcombobox, программа вылетает на 11 строке
Цитата Сообщение от vic5710 Посмотреть сообщение
pix = Qt.QPixmap(h-2,h-2)
с ошибкой Process finished with exit code -1073740791 (0xC0000409)

Цитата Сообщение от vic5710 Посмотреть сообщение
лучше с нуля напишите - QLineEdit, QToolButton, QLictView/QAbstractListModel всего-то
Тут у меня мало опыта работы с модельками, поэтому вряд ли получится. Да, и зачем переписывать QLineEdit с QToolButton, ведь они вроде нормально работают?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 12:04
Цитата Сообщение от DarkShaddow Посмотреть сообщение
При открытии qcombobox, программа вылетает на 11 строке
так в консоли-то что?
код запустился
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 12:05
вот так
Миниатюры
Как изменить стиль CheckBox в ComboBox (CheckableComboBox)  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 12:12
Цитата Сообщение от DarkShaddow Посмотреть сообщение
зачем переписывать QLineEdit с QToolButton, ведь они вроде нормально работают?
комбобокс заточен на single selection однозначно и при переделке на multi selection глюки будут по любому
а функционал дефолтный переделывать - сильно глубоко нужно копать
проще с чистого листа написать
можно и без модели - QListWidget использовать
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 12:15
запустите из терминала
Изображения
 
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 12:18  [ТС]
vic5710,
так в консоли-то что?
Process finished with exit code -1073740791 (0xC0000409)
код запустился
И стиль применился?
запустите из терминала
хорошо, только чуть позже тк я сейчас не дома
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2023, 12:18
Помогаю со студенческими работами здесь

Изменить стиль переключателя CheckBox в WPF
Всем привет! Уже какой день не могу найти решение! Не ужели никто не может помочь? Подскажите хотя бы. Я хочу изменить стиль переключателя...

Как изменить стиль формы и вообще всех объектов на свой стиль?
Собственно вопрос в том как изменить стиль формы и вообще всех объектов на свой стиль?

Свой стиль CheckBox для listbox и стиль кнопок
Здравствуйте. Несколько вопросов. 1 Как создать стиль своего CheckBox для listbox точнее нужно указать свои картинки на галочки. 2....

Как при выборе значения в combobox изменить значение другого combobox
Добрый день. Есть допустим бд с таблицей в которой есть name И number. Как сделать так, чтобы при выборе имени в комбобоксе во втором...

Как поменять стиль (форму) Checkbox (Сделать его круглым, квадратным)
Здравствуйте. Как поменять стиль(форму) Checkbox(Сделать его круглым, квадратным) и как поменять галочку к Примеру на крестик?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru