Русские Блоги
Использование QTableWidget (стиль, контекстное меню, свертывание заголовка таблицы, множественный выбор и т. Д.)
Сначала установите стиль формы
Ну, стиль установлен, эффект выглядит следующим образом:
Вопрос первый:При щелчке мышью на опции появится виртуальное окно, найдите блог на официальном сайте Qt, специально представленном, прямо по коду!
(1) Например, реализовать следующий класс
(2) Добавьте следующий код в структуру таблицы
ОК, пунктирная граница удалена
Вопрос второй:Когда в таблице есть только одна строка. Часовая головка рухнет.
Во-вторых, выбрать несколько и получить выбранный ряд
3. Форма операции (добавление, удаление строк и т. Д.)
(1) Динамически вставлять строки
(2) Вставьте строку в указанной позиции
фактически аналогичен (1), предпосылка (1) состоит в том, чтобы получить количество строк таблицы
В-четвертых, щелкните событие, вызванное заголовком
(1) Подключите сигнал и слот измерительной головки
(2) Реализовать функцию слота
5. Откройте строку для редактирования
Так как Windows эмулируется, это выглядит немного. Windows может изменить имя. Тогда Qt должен быть в состоянии достичь
ОК. Rename закончил!
Шесть, меню правой кнопкой мыши

Семерка, сигнал
Как получить значок файла (папки) и набрать на интерфейсе? Для файлов существует как минимум более 100 типов файлов с разными расширениями. Не возможно, если значки и типы являются фиксированными. Вот два способа получить это.
QFileIconProvider из Qt (получить значок файла, тип).
QFileIconProvider в QFile продолжен (получить значок файла, тип).
Для получения дополнительной информации о QTableView, пожалуйста, обратитесь к:
модель / представление Qt (обновление данных в режиме реального времени).
QtableView Qt.
8. QTableWidget получает выбранный контент и количество строк
Девять, дважды щелкните, чтобы найти номер строки, где находится QtableWidget
Десять слитых клеток
Таблица эффектов выглядит следующим образом:

Установить заголовок таблицы
Вышеуказанный код должен быть помещен после следующего кода, иначе он не будет иметь никакого эффекта
Эффект бега заключается в следующем:

Вы также можете поместить следующий код в ячейку:
Эффект бега заключается в следующем:

Ячейка является редактируемой по умолчанию. Следующий код может быть установлен только для чтения
По умолчанию ячейка может выбрать одну ячейку, следующий код может быть установлен для выбора строки
Скрыть заголовок списка
Вы также можете установить размер строк и столбцов в соответствии с содержимым
Создаем стиль интерфейса Qt на примере таблицы
Итак, начнем с теории. В Qt существует абстрактный класс QStyle, ответственный, как не сложно догадаться, за стилизацию приложения. От него унаследовано некоторое количество классов (QWindowStyle, QMacStyle и т.д.), которые представляют собой стили, эмулирующие стандартный внешний вид операционной системы. Мы будем делать свой стиль для приложения по их образу и подобию. Qt требует, чтобы пользовательские стили были унаследованы не напрямую от QStyle, а от одного из его классов-наследников. Документация рекомендует выбрать наиболее близкий к желаемому системный стиль, и изменить его «под себя». Мы же будем наследовать наш класс от не менее абстрактного, чем QStyle, класса QCommonStyle.
Как же происходит рисование элементов внутри стиля? Класс QStyle имеет набор функций, названия которых начинаются со слова draw:
- drawComplexControl()
- drawControl()
- drawItemPixmap()
- drawItemText()
- drawPrimitive()
Каждая из них делает свою небольшую часть работы по отрисовке элементов.
drawComplexControl() используется для рисования составных виджетов, то есть таких, которые содержат в самих себе несколько других виджетов.
В качестве примера можно привести QSpinBox, который, как несложно догадаться, реализует обычный SpinBox и состоит из поля ввода и двух маленьких кнопок: 
drawControl() рисует стандартные виджеты вроде кнопок и полей ввода.
drawPrimitive() рисует так называемые примитивные элементы, например, рамки.
drawItemPixmap() и drawItemText() имеют вполне говорящие названия и делают именно то, что вы могли бы от них ожидать. Детальные описание всех функций, а также их аргументов, можно очень легко найти в документации Qt, поэтому я на этом останавливаться не буду.
В нашем примере, мы будем делать стиль для элемента QTableWidget, который представляет собой обыкновенную таблицу. Стили для остальных элементов делаются абсолютно аналогично.
Начинаем
Первым делом, создадим новый класс С++. При создании класса, Qt услужливо предлагает нам написать его название, а так же название класса, от которого мы хотим наследовать. Назовем его для простоты myStyle, и укажем наследование от QCommonStyle. После этого, Qt создаст нам пару файлов (.h и .cpp), в которых, для начала, мы хотим получить примерно такую заготовку:
Наша функция main() будет выглядеть следующим образом:
Как видите, все что мы делаем — это устанавливаем наш стиль, создаем виджет и отображаем его. На данном этапе у нас есть только пустой стиль, унаследованный от QCommonStyle, поэтому наша таблица будет выглядеть… ну, скажем, не очень привлекательно:

Рассмотрим подробнее из чего состоит таблица. 
Структура, в общем, довольно простая и понятная. Стоит разве что остановиться на секунду на заголовках. В Qt разделяют два вида заголовков: горизонтальный (тот, который сверху), и вертикальный (тот, который слева). Под «Областью заголовка» я подразумеваю всю область, на которой впоследствии будет отображен заголовок. Секция — это каждая конкретная ячейка заголовка. Незанятая область — это та часть заголовка, на которой секций нет (это случается, когда суммарный размер всех секций меньше размера таблицы).
Итак, вооружившись этими знаниями, можно стилизовать каждый элемент. Начнем с добавления в наш класс функций
Начнем с функции drawControl(). Добавим в реализацию код:
Ключевой атрибут этой функции — это element, который указывает на тип того, что мы будем рисовать. Внутри switch‘a мы будем добавлять по case‘у для каждого из тех элементов, которые мы будем рисовать сами. Все остальные будут обрабатываться в default-секции с помощью аналогичной функции родительского класса.
Начнем с рамки, которая окружает нашу таблицу целиком. Я буду делать градиентную рамку. Верхняя и нижняя границы будут белыми, а вертикальные границы будут нарисованы градиентом: они будут белыми по краям и светло-серыми в середине.
Для этого добавим в функцию drawControl() следующий код:
Итак, что же здесь происходит. Сначала мы создаем линейный градиент, направленный сверху вниз. Затем мы задаем цвета для ключевых точек, которых у нас три: начало, конец и середина. Как я уже говорил, начало и конец мы делаем белыми, а середину чуть сероватой.
После этого мы создаем перо и устанавливаем в него наш градиент. Перо в Qt рисует с помощью кисти (QBrush), в роли которой будет выступать градиент. Наконец, функцией drawRect() мы рисуем нашу рамку.
Теперь приступим к заголовкам. Саму область заголовка (CE_Header) нам обрабатывать не нужно. Мы займемся секциями и пустой областью. С пустой областью все очень просто, мы закрасим ее однотонным серым цветом:
С секциями же придется несколько сложнее. Как мы знаем, если на заголовок таблицы нажать, то выделится либо вся строка, либо весь столбец (в зависимости от того, куда мы нажали). При этом заголовок поменяет свой внешний вид, чтобы пользователь видел изменение его состояния. Обычно заголовок либо «вдавливается», либо подкрашивается. Мы хотим сохранить эту функциональность. Более того, хотелось бы, чтобы при выделении ячейки или ячеек, соответствующие заголовки также окрашивались.
Итак, добавим следующий код:
Итак, секция может быть в двух состояниях: активном и неактивном. Для того, чтобы определить это, мы проверяем ее флаги. Флаг State_Sunken показывает, что секция нажата, а флаг State_On показывает, что выбрана ячейка, принадлежащая столбцу (или строке) этой секции. Если хотя бы один из них установлен, мы закрашиваем секцию ровным оранжевым цветом, а также рисуем для нее целиковую границу для того, чтобы оранжевая секция не смотрелась грубо на фоне других (не выделенных) светло-серых частей заголовка.
Если секция неактивна, мы закрашиваем ее градиентом от белого до светло-серого цвета и рисуем границу. Я решил рисовать только вертикальные границы секций, поэтому все что мне нужно — это изобразить вертикальную полоску справа от каждой секции. Чтобы полоски не смотрелись грубо, мы нарисуем их градиентом почти так же, как и рамку всей таблицы: концы полосок будут более светлыми, а середина — более темной. Для этого мы перенастраиваем градиент и устанавливаем его в перо, которым будет рисоваться полоса.
На данном этапе мы получили довольно симпатичный заголовок. Однако при выделении наши ячейки по-прежнему закрашиваются довольно некрасивым цветом по умолчанию. К тому же, стандартная фокусная рамка тоже выглядит не слишком красиво.
За отрисовку ячеек отвечает атрибут CE_ItemViewItem. Добавим в него следующий код:
Здесь нам пришлось сделать гораздо больше. Во-первых, за раскраску выделенных ячеек другим цветом отвечает элемент PE_PanelItemViewItem, который рисуется в функции drawPrimitive(). Поэтому мы должны вызвать эту функцию, передав туда имеющиеся у нас параметры. После этого мы преобразовываем указатель на опции с базового класса QStyleOption в нужный нам класс QStyleOptionViewItemV4. Это нужно, помимо прочего, для получения текста и области рисования этого текста.
Если ячейка, которую мы рисуем, является выделенной то мы рисуем небольшую серую рамку вокруг всей ячейки.
После этого мы получаем размер области, на которой должен бын выведен текст, и делаем небольшой отступ, чтобы текст не появился вплотную к левому верхнему краю. Наконец, мы рисуем текст функцией drawText().
Поскольку при обработки ячеек мы вызываем функцию drawPrimitive для элемента PE_PanelItemViewItem, реализуем отрисовку этого элмента, чтобы выделенные ячейки раскрашивались в какой-нибудь более приятный цвет.
По аналогии с drawControl(), добавим в drawPrimitive() точно такой же switch, и сразу реализуем нужную нам подсветку ячеек:
Наконец, изменим шрифт, которым будет выводиться текст. Добавим в функцию drawItemText() следующий код:
Итак, мы преобразили невзрачную табличку, и теперь она выглядит так:

что на мой взгляд гораздо лучше того, что было изначально.
Преимущества данного подхода
Конечно, создавать стили для всего приложения таким образом — весьма трудоемкая задача. Стиль для одного элемента (как в этой статье) можно сделать очень быстро, но если вы хотите позаботится о всех виджетах (например если вы хотите распространять свой стиль, чтобы другие люди могли им воспользоваться), это может отнять достаточно много времени. Описание элементов, которые должны быть нарисованы для каждого отдельно взятого виджета, я, к примеру, не нашел, и мне пришлось определять их методом «научного тыка». Однако у стилизации таким образом есть ряд существенных преимуществ.
Во-первых, эти стили применяются ко всем элементам. Если у вас есть 300таблиц, то вам не нужно настраивать каждую вручную, стиль к приложению применяется в одну строку.
Во-вторых, стили, созданные таким образом, удобно менять. Это, пожалуй, лучший способ предоставить пользователю возможность изменить стиль приложения через настройки. К тому же, вы можете быть точно уверены, что созданный вами стиль будет каждый раз выглядеть одинаково.
Change the color of a horizontal header in a QTableWidget
I only want to change the color of the vertical header. Couldn’t do anything with the stylesheet feature and all the solutions online are only for QTableView.
1 Answer 1
![]()
-
The Overflow Blog
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
QTableWidget Class
Виджеты таблиц предоставляют стандартные средства отображения таблиц для приложений. Элементы в QTableWidget предоставляются QTableWidgetItem .
Если вам нужна таблица, использующая вашу собственную модель данных, вам следует использовать QTableView, а не этот класс.
Виджеты таблицы могут быть сконструированы с необходимым количеством строк и столбцов:
Кроме того,таблицы можно создавать без заданного размера и изменять их размер позже:
Элементы создаются вне таблицы (без родительского виджета) и вставляются в таблицу с помощью setItem ():
Если вы хотите включить сортировку в виджете таблицы, сделайте это после того, как заполните его элементами, иначе сортировка может повлиять на порядок вставки (подробности см. в setItem ()).
Таблицы могут иметь как горизонтальные, так и вертикальные заголовки. Самый простой способ создать заголовки — предоставить список строк функциям setHorizontalHeaderLabels () и setVerticalHeaderLabels (). Они обеспечат простые текстовые заголовки для столбцов и строк таблицы. Более сложные заголовки могут быть созданы из существующих элементов таблицы, которые обычно строятся вне таблицы. Например, мы можем создать элемент таблицы со значком и выровненным текстом и использовать его в качестве заголовка для определенного столбца:
Количество строк в таблице можно узнать с помощью rowCount (), а количество столбцов с помощью columnCount (). Таблицу можно очистить с помощью функции clear ().
Property Documentation
столбецСчёт:int
Это свойство содержит количество столбцов в таблице
По умолчанию для таблицы,построенной без подсчета строк и столбцов,данное свойство содержит значение 0.
Access functions:
| int | columnCount() const |
| void | setColumnCount(int columns ) |
rowCount : int
Это свойство содержит количество строк в таблице
По умолчанию для таблицы,построенной без подсчета строк и столбцов,данное свойство содержит значение 0.
Access functions:
| int | rowCount() const |
| void | setRowCount(int rows ) |
Документация по функциям члена
QTableWidget::QTableWidget(int rows , int columns , Qвиджет * parent = nullptr)
Создает новый вид таблицы с заданным rows and columns , и с учетом parent .
QTableWidget::QTableWidget(QWidget * parent = nullptr)
Создает новый вид таблицы с заданным parent .
[signal] void QTableWidget::cellActivated(int row , int column )
Этот сигнал подается,когда ячейка,указанная в параметрах row and column активирован
[signal] void QTableWidget::cellChanged(int row , int column )
Этот сигнал подается всякий раз,когда данные элемента в ячейке,указанной в параметре row and column has changed.
[signal] void QTableWidget::cellClicked(int row , int column )
Этот сигнал посылается при каждом щелчке по ячейке таблицы. row and column указывается ячейка,которая была нажата.
[signal] void QTableWidget::cellDoubleClicked(int row , int column )
Этот сигнал посылается всякий раз,когда ячейка таблицы дважды щелкает. row and column указывается ячейка,которая была дважды щелкнута.
[signal] void QTableWidget::cellEntered(int row , int column )
Этот сигнал подается,когда курсор мыши входит в ячейку.Ячейка задается row and column .
Этот сигнал подается только при включенном отслеживании мыши или при нажатии кнопки мыши во время перемещения в элемент.
[signal] void QTableWidget::cellPressed(int row , int column )
Этот сигнал подается всякий раз,когда ячейка таблицы нажата. row and column указана ячейка,которая была нажата.
[slot] void QTableWidget::clear()
Удаляет все элементы в представлении. Это также удалит все выделения и заголовки. Если вы не хотите удалять заголовки, используйте QTableWidget :: clearContents (). Размеры стола остаются прежними.
[slot] void QTableWidget::clearContents()
Удаляет все элементы,не находящиеся в заголовках,из поля зрения.Это также удалит все выделения.Размеры таблицы останутся прежними.
[signal] void QTableWidget::currentCellChanged(int currentRow , int currentColumn , int previousRow , int previousColumn )
Этот сигнал подается всякий раз,когда меняется текущая ячейка.Ячейка,указанная previousRow and previousColumn это ячейка,которая ранее имела фокус,ячейка,указанная в currentRow and currentColumn это новая текущая ячейка.
[signal] void QTableWidget::currentItemChanged(QTableWidgetItem * current , QTableWidgetItem * previous )
Этот сигнал подается всякий раз,когда изменяется текущий элемент. previous пункт-это пункт,который ранее был в центре внимания, current это новый текущий пункт.
[slot] void QTableWidget::insertColumn(int column )
Вставляет пустую колонку в таблицу по адресу column .
[slot] void QTableWidget::insertRow(int row )
Вставляет пустую строку в таблицу по адресу row .
[signal] void QTableWidget::itemActivated(QTableWidgetItem * item )
Этот сигнал подается,когда указанное item активирован
[signal] void QTableWidget::itemChanged(QTableWidgetItem * item )
Этот сигнал посылается всякий раз,когда данные item has changed.
[signal] void QTableWidget::itemClicked(QTableWidgetItem * item )
Этот сигнал подается всякий раз,когда щелкает элемент в таблице. item указан тот пункт,который был кликнул.
[signal] void QTableWidget::itemDoubleClicked(QTableWidgetItem * item )
Этот сигнал подается всякий раз,когда элемент в таблице дважды щелкает. item указан элемент,на который был сделан двойной щелчок.
[signal] void QTableWidget::itemEntered(QTableWidgetItem * item )
Этот сигнал подается,когда курсор мыши входит в элемент. item это введенный элемент.
Этот сигнал подается только при включенном отслеживании мыши или при нажатии кнопки мыши во время перемещения в элемент.
[signal] void QTableWidget::itemPressed(QTableWidgetItem * item )
Этот сигнал подается всякий раз,когда нажимается какой-либо элемент таблицы. item указан тот пункт,который был нажат.
[signal] void QTableWidget::itemSelectionChanged()
Этот сигнал подается всякий раз,когда меняется выбор.
[slot] void QTableWidget::removeColumn(int column )
Снимает колонку column и все его предметы со стола.
[slot] void QTableWidget::removeRow(int row )
Удаляет строку row и все его предметы со стола.
[slot] void QTableWidget::scrollToItem(const QTableWidgetItem * item , QAbstractItemView::ScrollHint hint = EnsureVisible)
Прокручивает вид,если необходимо,чтобы убедиться,что item видно. hint параметр уточняет,где item должен быть расположен после операции.