С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 23.05.2021
Сообщений: 9
PyQt5

Добавить чекбоксы в заголовки столбцов таблицы

05.02.2022, 23:26. Показов 4700. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Возможно ли для каждого столбца таблицы, рядом с названием столбца поставить чекбокс?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.02.2022, 23:26
Ответы с готовыми решениями:

Передать заголовки столбцов таблицы
Здравствуйте! Помогите с таким вопросом. На форме разместил виджет QTableWidget. В него передаю содержимое загружаемого csv-файла....

Как добавить инкрементированные заголовки для столбцов в панде?
import pandas as pd md={'key1': , 'key2': } df=pd.DataFrame.from_dict(md, orient='index').reset_index() #rasscet chisla ...

Сортировка столбцов таблицы по клику на заголовки
не могу отсортировать таблицу (щелкаем на заголовок столбца, сортируется столбец) <!DOCTYPE html> <html...

23
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
06.02.2022, 18:53
как то так
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
from PyQt5.QtWidgets import QApplication, QTableView, QHeaderView, QStyleOptionButton, QStyle
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import Qt, pyqtSignal, QSize
 
class HeaderView(QHeaderView):
    state_changed = pyqtSignal(list)
    def __init__(self, orientation=Qt.Horizontal, parent=None):
        super().__init__(orientation, parent)
        self.setSectionsClickable(True)
        self.sectionClicked.connect(self.on_clicked)
        self.sectionCountChanged.connect(self.on_count_changed)
        
    def on_count_changed(self):
        self.state = [True for _ in range(self.count())]
        
    def on_clicked(self, idx):
        self.state[idx] ^= True
        self.state_changed.emit(self.state)
        
    def paintSection(self, painter, rect, logicalIndex):
        painter.save()
        QHeaderView.paintSection(self, painter, rect, logicalIndex)
        painter.restore()
        option = QStyleOptionButton()
        option.iconSize = QSize(10,10)
        option.rect = rect
        if self.state[logicalIndex]: option.state |= QStyle.State_On
        else: option.state |= QStyle.State_Off
        self.style().drawPrimitive(QStyle.PE_IndicatorCheckBox, option, painter)
 
 
app = QApplication([])
view = QTableView()
model=  QStandardItemModel(3,4)
view.setModel(model)
view.setHorizontalHeader(HeaderView())
view.show()
app.exec()
4
0 / 0 / 0
Регистрация: 23.05.2021
Сообщений: 9
06.02.2022, 19:12  [ТС]
Спасибо за ответ!

Получается либо виджет чекбокса либо текст? Одновременно не получиться отобразить?
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
06.02.2022, 19:31
можно. вся отрисовка в paintSection идет
Python
1
2
3
view = QTableWidget(3,4)
view.setHorizontalHeader(HeaderView())
view.setHorizontalHeaderLabels(['qwe qwe ','qwer','qwert','qwerty'])
0
0 / 0 / 0
Регистрация: 23.05.2021
Сообщений: 9
07.02.2022, 23:27  [ТС]
Спасибо за подсказку. Получается QTableView позволяет гибко настраивать дополнительное оформление, а вот QTableWidget уже нет. Придется переделывать свой код.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 05:26
Цитата Сообщение от gk-nk Посмотреть сообщение
а вот QTableWidget уже нет.
я же показал пример для QTableWidget
QHeaderView один и тот же
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
08.02.2022, 08:56
Цитата Сообщение от gk-nk Посмотреть сообщение
Получается либо виджет чекбокса либо текст? Одновременно не получиться отобразить?
Вопрос-то, наверное, возник потому, что примитив занимает всю площадь заголовка столбца:
Python
1
        option.rect = rect
Например, можно прижать его влево:
Python
1
        option.rect = QRect(rect.left(),rect.top(), rect.height(),  rect.height())
чтоб не мешал.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 10:50
gk-nk, iamvic, не понял вас обоих
Миниатюры
Добавить чекбоксы в заголовки столбцов таблицы  
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.02.2022, 11:07
Цитата Сообщение от vic5710 Посмотреть сообщение
def paintSection(self, painter, rect, logicalIndex):
И опять из пушки по вороьбям.

Метод data(), который с role, умеет обрабатывать role=Qt::CheckStateRole (см. https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum ).
Но для этого, gk-nk, используйте модели.
Цитата Сообщение от gk-nk Посмотреть сообщение
Получается QTableView позволяет гибко настраивать дополнительное оформление, а вот QTableWidget уже нет. Придется переделывать свой код.
Обазательно пришлось бы, не поэтому - так по другой причине. Дело даже не в оформлении. Прочитайте это: https://habr.com/ru/post/171443/
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 11:40
Цитата Сообщение от dondublon Посмотреть сообщение
Обазательно пришлось бы, не поэтому - так по другой причине. Дело даже не в оформлении. Прочитайте это: https://habr.com/ru/post/171443/

Не по теме:


dondublon, вы кроме этой статьи вообще что-нибудь знаете по теме? в ...надцатый раз эту ссылку вижу


критику вижу, предложения - нет. покажите свой вариант
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.02.2022, 11:51
vic5710, не знаю, куда уж мне.
Цитата Сообщение от vic5710 Посмотреть сообщение
в ...надцатый раз эту ссылку вижу
Ну извините
Да, я её советую всем новичкам, а новички тут появляются регулярно. Так что вы обречены видеть её и далее. Крепитесь

Цитата Сообщение от vic5710 Посмотреть сообщение
покажите свой вариант
Спешл фор ю:
Цитата Сообщение от dondublon Посмотреть сообщение
Метод data(), который с role, умеет обрабатывать role=Qt::CheckStateRole (см. https://doc.qt.io/qt-5/qt.html#ItemDataRole-enum ).
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 11:56
dondublon, и чтоб вы знали - headerData не обрабатывает CheckStateRole

Python
1
2
3
4
5
6
7
8
9
    def headerData(self,section,orientation,role):
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                return section
            if orientation == Qt.Vertical:
                return section
        if role == Qt.CheckStateRole:
            print(role)# а ничего нет
            return Qt.Checked
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
08.02.2022, 11:58
vic5710, пичаль-бида. Я невнимательно прочитал задание.
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
08.02.2022, 13:26
Цитата Сообщение от vic5710 Посмотреть сообщение
gk-nk, iamvic, не понял вас обоих
Вероятно, есть различия в реализациях на разных системах.
У Вас, наверное, Mac. а вот под Win7 и Linux картинки другие
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 16:43
iamvic, во как
вообще я привык что Qt везде одинаково работает, вроде как кроссплатформа
вот Винстайл
Миниатюры
Добавить чекбоксы в заголовки столбцов таблицы  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 16:45
линух у меня чисто сервак, поглядеть не могу
0
290 / 205 / 68
Регистрация: 18.09.2019
Сообщений: 407
Записей в блоге: 58
08.02.2022, 18:40
vic5710, а вот стоило добавить:
Python
1
2
if 'Windows' in QStyleFactory.keys():
    app.setStyle(QStyleFactory.create('Windows'))
и стало совсем понятно почему ТС спрашивал "чекбокс либо текст". Без указания стиля текст хотя бы на заднем плане
болтался, а теперь вообще не виден (PyQt 5.15.1)

И под Линукс примерно тоже самое.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
08.02.2022, 22:11
iamvic, вы невнимательны
Python
1
2
3
4
5
6
7
8
9
10
    def paintSection(self, painter, rect, logicalIndex):
        painter.save()
        QHeaderView.paintSection(self, painter, rect, logicalIndex)
        painter.restore()
        option = QStyleOptionButton()
        option.initFrom(self)
        option.rect = QRect(rect.left(), 0, 20, 20) #!
        if self.state[logicalIndex]: option.state |= QStyle.State_On
        else: option.state |= QStyle.State_Off
        self.style().drawPrimitive(QStyle.PE_IndicatorCheckBox, option, painter)
смысл в том что сначала рисуется дефолтная paintSection, вторым этапом - поверх рисуется дополнительно QCheckBox
oprion.rect - область рисования, я его уменьшил для ограничения области рисования
2
0 / 0 / 0
Регистрация: 23.05.2021
Сообщений: 9
09.02.2022, 08:27  [ТС]
Нужна еще одна подсказка, каким образом узнать какие столбцы выбраны пользователем? В заполненной таблице, расположение необходимых столбцов содержащие (имена точек, X, Y, H) может быть разным но последовательность именно такая (сперва идет НОМЕР, затем X и.т.д.), пользователь сам выбирает нужные столбцы. Необходимо по нажатию кнопки "Экспорт в AutoCAD" обрабатывались только указанные столбцы.
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,763
09.02.2022, 09:03
сигнал state_changed можете приконнектить куда вам надо
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
from PyQt5.QtWidgets import (QApplication, QTableView, QTableWidget,
QHeaderView, QStyleOptionButton, QStyle, QStyleFactory)
from PyQt5.QtGui import QStandardItemModel, QFont
from PyQt5.QtCore import Qt, pyqtSignal, QSize, QRect
 
class HeaderView(QHeaderView):
    state_changed = pyqtSignal(list)
    def __init__(self, orientation=Qt.Horizontal, parent=None):
        super().__init__(orientation, parent)
        self.setSectionsClickable(True)
        self.sectionClicked.connect(self.on_clicked)
        self.sectionCountChanged.connect(self.on_count_changed)
        self.state_changed.connect(self.on_state_changed)
        
    def on_state_changed(self):
        print('selected:',*[i for i in range(self.count()) if self.state[i]])
        
    def on_count_changed(self):
        self.state = [True for _ in range(self.count())]
        
        
    def on_clicked(self, idx):
        self.state[idx] ^= True
        self.state_changed.emit(self.state)
        
    def paintSection(self, painter, rect, logicalIndex):
        painter.save()
        QHeaderView.paintSection(self, painter, rect, logicalIndex)
        painter.restore()
        option = QStyleOptionButton()
        option.initFrom(self)
        option.rect = QRect(rect.left(), rect.top(), 20, 20)
        if self.state[logicalIndex]: option.state |= QStyle.State_On
        else: option.state |= QStyle.State_Off
        self.style().drawPrimitive(QStyle.PE_IndicatorCheckBox, option, painter)
 
app = QApplication([])
print(QStyleFactory.keys())
app.setStyle('Windows')
view = QTableWidget(3,4)
head = HeaderView()
head.setSectionResizeMode(1)
view.setHorizontalHeader(head)
view.setHorizontalHeaderLabels(['один','два','шестнадцать','четыре'])
view.setFont(QFont('times',18))
view.resize(600,300)
view.show()
app.exec()
Добавлено через 9 минут
точнее так
Python
1
2
    def on_state_changed(self, lst):
        print('selected:',*[i for i in range(len(lst)) if lst[i]])
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2022, 09:03
Помогаю со студенческими работами здесь

Заголовки столбцов из значений другой таблицы
Приветствую. sql, C#, windows forms Имеются несколько готовый таблиц... ...

Нужно добавить в оба массива заголовки строк и столбцов
public partial class Form1 : Form { float a = new float; int i, j, n, m; public Form1() { ...

Переименовать заголовки столбцов (шапку) таблицы listview
Есть таблица listview с 2 столбцами. Возможно ли при нажатии на кнопку переименовать шапку таблицы? Например шапка таблицы - Марка |...

Как скрыть заголовки столбцов таблицы jTable?
Как скрыть заголовки столбцов таблицы jTable?

Как в combobox добавить название(заголовки)таблицы
Здравствуйте.Как можно на форме в combobox добавить название(заголовки)таблицы путем цикла vb


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru