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

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

28.01.2023, 22:26. Показов 3284. Ответов 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
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 19:46  [ТС]
Студворк — интернет-сервис помощи студентам
vic5710, не знал, что в терминале выводится более подробная инфа о ошибке
Миниатюры
Как изменить стиль CheckBox в ComboBox (CheckableComboBox)  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
30.01.2023, 21:16
в пайчарм терминал свой есть, без него никак
странно, у мну никакой ошибки нет
но я бы сделал с нуля
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
from PyQt5 import Qt
 
class Model(Qt.QAbstractListModel):
    def __init__(self):
        super().__init__()
        self._data = []
        self._checklist = []
        
    def rowCount(self,index):
        return len(self._data)
        
    def data(self,index,role):
        row = index.row()
        if role == Qt.Qt.DisplayRole:
            return self._data[row]
        elif role == Qt.Qt.DecorationRole:
            if self._checklist[row]: return Qt.QColor('red')
            else: return Qt.QColor('green')
            
    def flags(self,index):
        #return Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsSelectable
        return Qt.Qt.ItemIsEnabled
        
    def load(self,lst):
        self.beginResetModel()
        self._data = lst
        self._checklist = [False]*len(lst)
        self.endResetModel()
        
    def get_items(self):
        l = [i[0] for i in zip(self._data,self._checklist) if i[1]]
        return ';'.join(l)
 
class W(Qt.QWidget):
    def __init__(self):
        super().__init__()
        self.line = Qt.QLineEdit()
        self.line.setReadOnly(True)
        self.btn = Qt.QToolButton()
        self.model = Model()
        self.lst = Qt.QListView()
        self.lst.setModel(self.model)
        self.lst.setWindowFlags(Qt.Qt.Popup)
        hbox = Qt.QHBoxLayout(self)
        hbox.setContentsMargins(1,1,1,1)
        hbox.addWidget(self.line)
        hbox.addWidget(self.btn)
        self.btn.clicked.connect(self.on_popup)
        self.lst.clicked.connect(self.state_changed)
        self.lst.hide()
        
        self.model.load(list('qwerty'))
        
    def state_changed(self,index):
        self.model._checklist[index.row()] ^= True
        self.model.layoutChanged.emit()
        self.line.setText(self.model.get_items())
        
    def on_popup(self):
        if self.lst.isVisible():
            self.lst.hide()
        else:
            self.lst.resize(self.width(),120) 
            self.lst.move(self.mapToGlobal(Qt.QPoint(0,self.height())))
            self.lst.show()
       
app = Qt.QApplication([])
w = W()
w.show()
app.exec()
черновой вариант такой
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
30.01.2023, 23:09  [ТС]
vic5710, при использовании модели теперь сигнал при нажатии на индикатор выбора не поступает (не меняется изображение), но хотя бы я понял как поставить изображение на место цвета. Хотя было бы намного проще, если я просто мог применить этот стиль:
CSS
1
2
3
4
5
6
7
8
QComboBox::indicator:unchecked
    {
        image: url(Dark_rc/checkbox_unchecked.png);
    }
    QComboBox::indicator:checked
    {
        image: url(Dark_rc/checkbox_checked.png);
    }
Но он у меня почему-то не применяется.

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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
import sys
import typing
 
from PyQt5.Qt import QItemDelegate
from PyQt5 import QtGui, QtCore, QtWidgets
from PyQt5.QtCore import QAbstractListModel
from PyQt5.QtGui import QColor
from PyQt5.QtGui import QStandardItem
 
 
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QStandardItemModel
 
 
class Model(QStandardItemModel):
    def __init__(self):
        super().__init__()
        self._data = []
        self._checklist = []
 
    def rowCount(self, index):
        return len(self._data)
 
    def data(self, index, role):
        row = index.row()
        if role == Qt.DisplayRole:
            return self._data[row]
        elif role == Qt.DecorationRole:
            if self._checklist[row]:
                return QtGui.QPixmap("Dark_rc/checkbox_checked.png")
            else:
                return QtGui.QPixmap("Dark_rc/checkbox_unchecked.png")
 
    def flags(self, index):
        # return Qt.ItemIsEnabled | Qt.ItemIsSelectable
        return Qt.ItemIsEnabled
    #
    def load(self, lst):
        self.beginResetModel()
        self._data = lst
        self._checklist = [False] * len(lst)
        self.endResetModel()
 
    def get_items(self):
        l = [i[0] for i in zip(self._data, self._checklist) if i[1]]
        return ';'.join(l)
 
# class Delegate(QItemDelegate):
#     def __init__(self, parent=None):
#         super().__init__()
#         self.parent = parent
#
#     def paint(self, painter, option, index):
#         row = index.row()
#         # pixmap = QtGui.QPixmap("Dark_rc/checkbox_unchecked.png")
#         # painter.drawPixmap(5,0, pixmap)
#         super(Delegate, self).paint(painter, option, index)
 
 
class MyCheckableComboBox(QtWidgets.QComboBox):
    def __init__(self):
        super().__init__()
        self.setEditable(True)
        self.lineEdit().setReadOnly(True)
        self.closeOnLineEditClick = False
        print(self.model())
        model = Model()
        model.load(list('asdfgh'))
        self.setModel(model)
        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::indicator:unchecked
    {
        image: url(Dark_rc/checkbox_unchecked.png);
    }
    QComboBox::indicator:checked
    {
        image: url(Dark_rc/checkbox_checked.png);
    }
    
    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_())
И спасибо вам, что помогаете
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
31.01.2023, 07:13
Лучший ответ Сообщение было отмечено DarkShaddow как решение

Решение

вы применяйте стиль не к приложению, а к виджету
box.setStyleSheеt(style_sheet)

Не по теме:

я написал минимальный вариант как я вижу, улучшайте его

0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
31.01.2023, 22:59  [ТС]
vic5710, стиль все же применился. Надо было просто прописать его без QComboBox:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        self.checkComboBox.setStyleSheet("""
        :indicator
        {
            width: 18px;
            height: 18px;
            margin-bottom: 1px;
            margin-top: 1px;
        }
        :indicator:unchecked
        {
            image: url(Dark_rc/checkbox_unchecked.png);
        }
        :indicator:checked
        {
            image: url(Dark_rc/checkbox_checked.png);
        }
    """)
А что касается модельки, то в целом я понимаю, что именно надо сделать, но не понимаю как. Вот как вообще отследить нажатие на этот зеленый квадратик?

И еще раз спасибо вам за помощь.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
01.02.2023, 00:30
Цитата Сообщение от DarkShaddow Посмотреть сообщение
понимаю, что именно надо сделать, но не понимаю как.
http://blog.kislenko.net/show.php?id=1511
https://russianblogs.com/article/7388794016/
тут работа с моделями обьясняется

Добавлено через 50 минут
Цитата Сообщение от DarkShaddow Посмотреть сообщение
как вообще отследить нажатие на этот зеленый квадратик?
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
class ListModel(Qt.QAbstractListModel):
    def __init__(self):
        super().__init__()
        self._data = []
        self._checklist = []
        
    def rowCount(self,index):
        return len(self._data)
        
    def data(self,index,role):
        row = index.row()
        if role == Qt.Qt.DisplayRole:
            return self._data[row]
        elif role == Qt.Qt.DecorationRole:
            if self._checklist[row]: return Qt.QIcon('checked.png')
            else: return Qt.QIcon('unchecked.png')
            
    def flags(self,index):
        return Qt.Qt.ItemIsEnabled | Qt.Qt.ItemIsSelectable
        
    def load(self,lst):
        self.beginResetModel()
        self._data = lst
        self._checklist = [False]*len(lst)
        self.endResetModel()
        
    def get(self):
        return ','.join(x for x,y in zip(self._data,self._checklist) if y)
 
class View(Qt.QListView):
    state_changed = pyqtSignal(str)
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.Qt.Popup)
        self.setAlternatingRowColors(True)
        self.model = ListModel()
        self.setModel(self.model)
        self.clicked.connect(self.state_change)# отслеживается клик по элементу
 
    def state_change(self,index):
        self.model._checklist[index.row()] ^= True
        self.model.layoutChanged.emit()
        self.state_changed.emit(self.model.get())
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
01.02.2023, 09:27
чота не спалось, допилил чутка
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
from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout, 
QLineEdit, QListView, QToolButton)
from PyQt5.QtCore import Qt,QAbstractListModel,pyqtSignal, pyqtSlot,QPoint
from PyQt5.QtGui import QIcon, QFont
 
style_sheet='''
QListView {
    background-color:white;
}
QListView::item:alternate {
    background:#f7f7f7;
} 
QListView::item::hover {
    background: #0ff;
}
'''
class ListModel(QAbstractListModel):
    def __init__(self):
        super().__init__()
        self._data = []
        self._checklist = []
        
    def rowCount(self,index):
        return len(self._data)
        
    def data(self,index,role):
        row = index.row()
        if role == Qt.DisplayRole:
            return self._data[row]
        elif role == Qt.DecorationRole:
            if self._checklist[row]: return QIcon('checked.png')
            else: return QIcon('unchecked.png')
            
    def flags(self,index):
        return Qt.ItemIsEnabled #| Qt.ItemIsSelectable
        
    def load(self,lst):
        self.beginResetModel()
        self._data = lst
        self._checklist = [False]*len(lst)
        self.endResetModel()
        
    def get(self):
        return ','.join(x for x,y in zip(self._data,self._checklist) if y)
 
class View(QListView):
    state_changed = pyqtSignal(str)
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.Popup)
        self.setAlternatingRowColors(True)
        self.setStyleSheet(style_sheet)
        self.model = ListModel()
        self.setModel(self.model)
        self.clicked.connect(self.state_change)# отслеживается клик по элементу
 
    def state_change(self,index):
        self.model._checklist[index.row()] ^= True
        self.model.layoutChanged.emit()
        self.state_changed.emit(self.model.get())
    
class mComboBox(QWidget):
    def __init__(self):
        super().__init__()
        self.line = QLineEdit()
        self.line.setReadOnly(True)
        self.btn = QToolButton()
        self.btn.setStyleSheet("padding: 0px; margin: 0px;")
        self.btn.setIcon(QIcon('arrowdown.png'))
        self.view = View()
        hbox = QHBoxLayout(self)
        hbox.setContentsMargins(1,1,1,1)
        hbox.setSpacing(0)
        hbox.addWidget(self.line)
        hbox.addWidget(self.btn)
        self.btn.clicked.connect(self.on_popup)
        self.view.state_changed.connect(lambda x: self.line.setText(x))
        
    def on_popup(self):
        if self.view.isVisible(): 
            self.view.hide()
        else: 
            self.view.resize(self.width(),120) 
            self.view.move(self.mapToGlobal(QPoint(0,self.height())))
            self.view.setFont(self.font())
            self.view.show()
 
app = QApplication([])
w = mComboBox()
w.setFont(QFont('times',16))
w.view.model.load(list('qwerty'))
w.show()
app.exec()
Миниатюры
Как изменить стиль CheckBox в ComboBox (CheckableComboBox)  
1
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
01.02.2023, 11:16  [ТС]
vic5710, спасибо большое, помогли
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
04.02.2023, 15:17  [ТС]
vic5710, возникла проблема, что всплывающее меню в QListView не дает взаимодействовать с другими элементами окна (не закрывается ни при нажатии на кнопку, ни при нажатии на другой любой элемент в окошке). Я пробовал заменить
Цитата Сообщение от vic5710 Посмотреть сообщение
self.setWindowFlags(Qt.Popup)
на self.setWindowFlags(QtCore.Qt.FramelessW indowHint), но мне не нравиться, что создается новое окно. Есть способ решить проблему?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
04.02.2023, 16:29
в моем варианте все закрывается
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
04.02.2023, 18:22  [ТС]
vic5710, я использовал ваш вариант, но у меня не закрывается (закрывается только, если свернуть основное окно через панель задач) Видимо из-за разных ОС или версий QT.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
04.02.2023, 19:44
код свой покажите
0
7 / 7 / 0
Регистрация: 03.10.2020
Сообщений: 164
04.02.2023, 22:26  [ТС]
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
98
99
100
101
102
103
104
105
106
from PyQt5 import QtCore
from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout,
                             QLineEdit, QListView, QToolButton)
from PyQt5.QtCore import Qt, QAbstractListModel, pyqtSignal, pyqtSlot, QPoint
from PyQt5.QtGui import QIcon, QFont
from PyQt5.QtWidgets import QDialog
 
style_sheet = '''
QListView {
    background-color:white;
}
QListView::item:alternate {
    background:#f7f7f7;
} 
QListView::item::hover {
    background: #0ff;
}
'''
 
 
class ListModel(QAbstractListModel):
    def __init__(self):
        super().__init__()
        self._data = []
        self._checklist = []
 
    def rowCount(self, index):
        return len(self._data)
 
    def data(self, index, role):
        row = index.row()
        if role == Qt.DisplayRole:
            return self._data[row]
        elif role == Qt.DecorationRole:
            if self._checklist[row]:
                return QIcon('Dark_rc/checkbox_checked.png')
            else:
                return QIcon('Dark_rc/checkbox_unchecked.png')
 
    def flags(self, index):
        return Qt.ItemIsEnabled  # | Qt.ItemIsSelectable
 
    def load(self, lst):
        self.beginResetModel()
        self._data = lst
        self._checklist = [False] * len(lst)
        self.endResetModel()
 
    def get(self):
        return ', '.join(x for x, y in zip(self._data, self._checklist) if y)
 
 
class View(QListView):
    state_changed = pyqtSignal(str)
    def __init__(self):
        super().__init__()
        self.setStyleSheet("padding: 0px; margin: 0px;")
        self.setWindowFlags(Qt.Popup)
        # self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        # self.setWindowFlags(Qt.FramelessWindowHint)
        # self.window = QDialog()
        self.setAlternatingRowColors(True)
        self.setStyleSheet(style_sheet)
        self.model = ListModel()
        self.setModel(self.model)
        self.clicked.connect(self.state_change)  # отслеживается клик по элементу
 
    def state_change(self, index):
        self.model._checklist[index.row()] ^= True
        self.model.layoutChanged.emit()
        self.state_changed.emit(self.model.get())
 
 
class mComboBox(QWidget):
    def __init__(self):
        super().__init__()
        self.line = QLineEdit()
        self.line.setReadOnly(True)
        self.btn = QToolButton()
        self.setStyleSheet("padding: 0px; margin: 0px;")
        self.btn.setIcon(QIcon('img_rc/array_down.png'))
        self.view = View()
        hbox = QHBoxLayout(self)
        hbox.setContentsMargins(1, 1, 1, 1)
        hbox.setSpacing(0)
        hbox.addWidget(self.line)
        hbox.addWidget(self.btn)
        self.btn.clicked.connect(self.on_popup)
        self.view.state_changed.connect(lambda x: self.line.setText(x))
 
    def on_popup(self):
        print('123')
        if self.view.isVisible():
            self.view.hide()
        else:
            self.view.resize(self.width(), 120)
            self.view.move(self.mapToGlobal(QPoint(0, self.height())))
            self.view.setFont(self.font())
            self.view.show()
 
app = QApplication([])
w = mComboBox()
w.setFont(QFont('times', 16))
w.view.model.load(list('qwerty'))
w.show()
app.exec()
Вложения
Тип файла: mp4 output(compress-video-online.com) (1).mp4 (1.41 Мб, 10 просмотров)
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
05.02.2023, 10:30
у меня все открывается/закрывается. ОС какая?
можно добавить закрытие по Escape
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class View(QListView):
    state_changed = pyqtSignal(str)
    def __init__(self):
        super().__init__()
        self.setWindowFlags(Qt.Popup)
        self.setAlternatingRowColors(True)
        self.setStyleSheet('selection-background-color: #cde;selection-color: #000');
        self.model = ListModel()
        self.setModel(self.model)
        self.clicked.connect(self.state_change)
        
    def keyPressEvent(self,e):
        key = e.key()
        if key == Qt.Key_Space:
            self.state_change(self.currentIndex())
        elif key == Qt.Key_Escape:
            self.hide()
        super(View,self).keyPressEvent(e)
        
    def state_change(self,index):
        self.model._checklist[index.row()] ^= True
        self.model.layoutChanged.emit()
        self.state_changed.emit(self.model.get())
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.02.2023, 10:30
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
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, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru