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

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

05.02.2022, 23:26. Показов 4778. Ответов 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,764
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,764
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,764
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,764
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,764
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,764
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,764
08.02.2022, 16:43
iamvic, во как
вообще я привык что Qt везде одинаково работает, вроде как кроссплатформа
вот Винстайл
Миниатюры
Добавить чекбоксы в заголовки столбцов таблицы  
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
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,764
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,764
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
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru