QTableView, интерактивное изменение заголовков
Здравствуйте.
Нужно добавить возможность изменения заголовков таблицы пользователем.
Кликнув 2 раза на ячейке можно изменить её. С заголовком это не проходит.
1) Как отловить клик мыши по заголовку?
При изменении ячейки мне нужно проверить, что введено число. И в случае ошибки вывести сообщение.
2) Какую функцию переопределить? Куда копать?
ecnpyt
23.01.10 13:38:43 MSK

model->setHeader() — так можно сменить заголовок.
Представление умеет сортировку по клику, значит мышь ловить оно умеет)
wyldrodney ☆
( 23.01.10 14:07:09 MSK )
Ответ на: комментарий от wyldrodney 23.01.10 14:07:09 MSK
Про model->setHeader() я знаю.
Ещё я знаю, что прийдется создать класс, который унаследует QTableView.
Продолжаю копать док-ю.
ecnpyt
( 23.01.10 14:24:48 MSK ) автор топика
Ответ на: комментарий от ecnpyt 23.01.10 14:24:48 MSK

может поможет сделать своего наследника QTableWidgetItem, назначить ему уже события на клики, и потом сделать setHorizontalHeaderItem(i, item) для каждого столбца при создании таблички?
RedPossum ★★★★★
( 23.01.10 14:53:35 MSK )
Ответ на: комментарий от RedPossum 23.01.10 14:53:35 MSK

но это для QTableWidget
RedPossum ★★★★★
( 23.01.10 14:54:30 MSK )

это надо читать маны в сторону делегатов (delegates)
azure ★★
( 23.01.10 16:01:13 MSK )
Секции QHeaderView не имеют индексов в модели (QModelIndex), поэтому редактировать их обычным способом не получится. Можно обрабатывать сигнал QHeaderView::sectionDoubleClicked ( int logicalIndex ), создавая редактор над указанной секцией.
Редактором тогда будет какой-нибудь QLineEdit, через installEventFilter получающий фильтр, который должен будет ловить нажатия Enter, Esc и т.д., подтверждая изменения через QSqlQueryModel::setHeaderData() например, и/или уничтожая редактор.
При изменении ячейки мне нужно проверить, что введено число
Если для указанного QLineEdit при создании вызвать setValidator( new QIntValidator( this ) ), то ввести туда можно будет только целое число.
summatus ★
( 23.01.10 18:39:26 MSK )
Ответ на: комментарий от azure 23.01.10 16:01:13 MSK
Спасибо. Я создал делегата, у которого в качестве редактора используется QDoubleSpinBox. Это решило проблему фильтрации ввода автоматически.
ecnpyt
( 24.01.10 12:49:21 MSK ) автор топика
Ответ на: комментарий от summatus 23.01.10 18:39:26 MSK
Да, спасибо за подсказки.
Из QTableView я смог получить QHeaderView. И соединить сигнал sectionDoubleClicked ( int logicalIndex ) со своим слотом.
Но как создать над заголовком редактор пока не понял.
ecnpyt
( 24.01.10 12:52:06 MSK ) автор топика
Ответ на: комментарий от ecnpyt 24.01.10 12:52:06 MSK
Пока что я сделал проще. При нажатии на заголовок появляется диалог со строкой ввода. А потом я просто устанавливаю новое имя.
Вот кусочек кода из слота:
bool ok;
QString text = QInputDialog::getText(this, tr(«QInputDialog::getText()»), tr(«Заголовок:»), QLineEdit::Normal,
tr(«»)), &ok);
if (ok && !text.isEmpty()) {
QStandardItem *p_item = new QStandardItem(text);
tablemodel->setVerticalHeaderItem(section, p_item);
}
Но вопрос с созданием редактора внутри заголовка открыт.
Я попробовал применить к QHeaderView делагат, который создал для обычных ячеек. QHeaderView является потомком QAbstractView, у которого есть метод setItemDelegate. Но по нажатию на заголовок редактор не появляется, заголовок просто выделяется. Наверно, надо изменить какие-то свойства заголовка, но я не нашел ничего подходящего.
ecnpyt
( 24.01.10 13:14:19 MSK ) автор топика
Ответ на: комментарий от ecnpyt 24.01.10 12:52:06 MSK
>Но как создать над заголовком редактор пока не понял.
Потомок будет нарисован в родителе, если это указать, например, при его создании. Т.к. QHeaderView — часть QTableView, то если указать таблицу в качестве parent для любого виджета, он будет в ней нарисован.
Для позиционирования редактора в заголовке, видимо, придётся его помещать в какой-нибудь layout, а сам layout создавать в таблице. Методом QXXXLayout::addSpacing, задавать смещение редактора. Нужное смещение и ширину можно узнать при помощи QHeaderView::sectionSize().
Вообще правильный путь в твоём случае — наследовать QHeaderView -> EditableHeaderView, и переопределять методы обработки событий мыши и отрисовки. То что я предлагаю, в сравнении с этим — костыль.
Qt как выделить заголовок qtablewidget
Есть таблица tableWidget типа QTableWidget. При выводе информации в её строки заголовок этой таблицы имеет белый цвет (я поставил для этой таблицы свойство styleSheet равным background-color(255,255,255) ).
Можно ли сделать так, чтобы заголовок таблицы отображался каким-то другим цветом (например, серым—RGB(238,238,238) )? Если да, то как это сделать?
Сообщ. #2 , 30.03.23, 19:58
Рейтинг (т): 51
Да, это можно сделать с помощью стилей. Вот как это можно сделать:
Откройте дизайнер форм в Qt Creator и выделите таблицу QTableWidget.
Найдите свойство «styleSheet» и кликните по значку редактирования (три точки «. » справа от поля).
В окне редактирования стилей вставьте следующий код:
QHeaderView::section < background-color: rgb(238,238,238);
Сохраните изменения.
Этот код задает свойство «background-color» для элемента QHeaderView, который отвечает за отображение заголовков таблицы. После сохранения изменений заголовок таблицы должен отображаться серым цветом.
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets
- Следующая тема
Qt как выделить заголовок qtablewidget
Подскажите, как принято выделять строку в QTableWidget? Мне нужно выделить сразу несколько строк (не обязательно идущих друг за другом). Сейчас выделяю поэлементно. Метода selectRow(int) не нашел.
Re: Как выделять строку в QTableWidget?
| От: | lazyrun | |
| Дата: | 31.01.11 07:36 | |
| Оценка: | 2 (1) | |
Здравствуйте, cresta, Вы писали:
C>Привет!
C>Подскажите, как принято выделять строку в QTableWidget? Мне нужно выделить сразу несколько строк (не обязательно идущих друг за другом). Сейчас выделяю поэлементно. Метода selectRow(int) не нашел.
C>Заранее благодарен.
void QTableView::selectRow ( int row ) [slot]
Selects the given row in the table view if the current SelectionMode and SelectionBehavior allows rows to be selected.
See also selectColumn().
Re[2]: Как выделять строку в QTableWidget?
| От: | cresta |
| Дата: | 31.01.11 07:57 |
| Оценка: |
Здравствуйте, lazyrun, Вы писали:
L>
L>void QTableView::selectRow ( int row ) [slot]
L>Selects the given row in the table view if the current SelectionMode and SelectionBehavior allows rows to be selected.
L>See also selectColumn().
Спасибо. А для того чтобы снять выделение нету метода? Поэлементно делать?
Re[3]: Как выделять строку в QTableWidget?
| От: | lazyrun |
| Дата: | 31.01.11 08:02 |
| Оценка: |
Здравствуйте, cresta, Вы писали:
C>Здравствуйте, lazyrun, Вы писали:
L>>
L>>void QTableView::selectRow ( int row ) [slot]
L>>Selects the given row in the table view if the current SelectionMode and SelectionBehavior allows rows to be selected.
L>>See also selectColumn().
C>Спасибо. А для того чтобы снять выделение нету метода? Поэлементно делать?
Нах?
table->selectionModel()->clearSelection()
Re[4]: Как выделять строку в QTableWidget?
| От: | cresta |
| Дата: | 31.01.11 08:08 |
| Оценка: |
Здравствуйте, lazyrun, Вы писали:
L>table->selectionModel()->clearSelection()
ОК. А если только с одной строки нужн снять выделение?
Re[5]: Как выделять строку в QTableWidget?
| От: | lazyrun |
| Дата: | 31.01.11 08:16 |
| Оценка: |
Здравствуйте, cresta, Вы писали:
C>Здравствуйте, lazyrun, Вы писали:
L>>table->selectionModel()->clearSelection()
C>ОК. А если только с одной строки нужн снять выделение?
Всё это конечно весело, но почему бы не почитать ассистанта, всё же элементарно?
void QItemSelectionModel::select ( const QModelIndex & index, QItemSelectionModel::SelectionFlags command ) [virtual slot]
QItemSelectionModel::Deselect 0x0004 All specified indexes will be deselected.
Re[6]: Как выделять строку в QTableWidget?
| От: | cresta |
| Дата: | 31.01.11 08:19 |
| Оценка: |
Здравствуйте, lazyrun, Вы писали:
L>Всё это конечно весело, но почему бы не почитать ассистанта, всё же элементарно?
L>
L>void QItemSelectionModel::select ( const QModelIndex & index, QItemSelectionModel::SelectionFlags command ) [virtual slot]
L>QItemSelectionModel::Deselect 0x0004 All specified indexes will be deselected.
Спасибо еще раз! Потому что тороплюсь, а в ассистанте сразу не нашел(
Re[7]: Как выделять строку в QTableWidget?
| От: | lazyrun |
| Дата: | 31.01.11 08:22 |
| Оценка: |
Здравствуйте, cresta, Вы писали:
C>Здравствуйте, lazyrun, Вы писали:
L>>Всё это конечно весело, но почему бы не почитать ассистанта, всё же элементарно?
C>Спасибо еще раз! Потому что тороплюсь, а в ассистанте сразу не нашел(
void QTableWidget::setRangeSelected ( const QTableWidgetSelectionRange & range, bool select )
Selects or deselects the range depending on select.
Единственно что я с Qtablewidget не работаю, т.к. это всего лишь обертка над tableview так, что советы все даю для tableview.
Re[8]: Как выделять строку в QTableWidget?
| От: | cresta |
| Дата: | 31.01.11 08:26 |
| Оценка: |
Здравствуйте, lazyrun, Вы писали:
L>Вроде еще есть
L>
L>void QTableWidget::setRangeSelected ( const QTableWidgetSelectionRange & range, bool select )
L>Selects or deselects the range depending on select.
L>Единственно что я с Qtablewidget не работаю, т.к. это всего лишь обертка над tableview так, что советы все даю для tableview.
ОК, понятно, посмотрю как удобнее будет.
Qt как выделить заголовок qtablewidget
На этом шаге мы рассмотрим назначение, формат конструктора, пример и основные методы класса QTableView .
Класс QTableView реализует таблицу (рисунок 1). Иерархия наследования выглядит так:
(QObject, QPaintDevice) - QWidget - QFrame - QAbstractScrollArea - QAbstractItemView - QTableView
Рис.1. Компонент QTableView
Текст приложения совпадает с приложением 141 шага.
# -*- coding: utf-8 -*- from PyQt5 import QtWidgets, QtGui import sys app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.setWindowTitle("QStandardItemModel") sti = QtGui.QStandardItemModel(parent=window) lst1 = ['Perl', 'PHP', 'Python', 'Ruby'] lst2 = ['http://www.perl.org/', 'http://php.net/', 'https://www.python.org/', 'https://www.ruby-lang.org/'] tv = QtWidgets.QTableView() for row in range(0, 4): if row == 2: iconfile = 'python.png' else: iconfile = 'icon.png' item1 = QtGui.QStandardItem(QtGui.QIcon(iconfile), '') item2 = QtGui.QStandardItem(lst1[row]) item3 = QtGui.QStandardItem(lst2[row]) sti.appendRow([item1, item2, item3]) sti.setHorizontalHeaderLabels(['Значок', 'Название', 'Сайт']) tv.setModel(sti) tv.setColumnWidth(0, 50) tv.setColumnWidth(2, 180) vbox = QtWidgets.QVBoxLayout() vbox.addWidget(tv) window.setLayout(vbox) window.resize(400,200) window.show() sys.exit(app.exec_())
Архив с файлами можно взять здесь.
Формат конструктора класса QTableView :
Объект> = QTableView([parent=Родитель>]
selectRow ( ) — выделяет строку с указанным индексом. Метод является слотом;
view.horizontalHeader().hide() view.verticalHeader().hide()