7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
PyQt5

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

28.01.2023, 22:26. Показов 3292. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru