LINUX.ORG.RU

QTableView, интерактивное изменение заголовков


0

0

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


model->setHeader() — так можно сменить заголовок.

Представление умеет сортировку по клику, значит мышь ловить оно умеет)

wyldrodney
()
Ответ на: комментарий от wyldrodney

Про model->setHeader() я знаю.

Ещё я знаю, что прийдется создать класс, который унаследует QTableView.
Продолжаю копать док-ю.

ecnpyt
() автор топика
Ответ на: комментарий от ecnpyt

может поможет сделать своего наследника QTableWidgetItem, назначить ему уже события на клики, и потом сделать setHorizontalHeaderItem(i, item) для каждого столбца при создании таблички?

RedPossum ★★★★★
()

Секции QHeaderView не имеют индексов в модели (QModelIndex), поэтому редактировать их обычным способом не получится. Можно обрабатывать сигнал QHeaderView::sectionDoubleClicked ( int logicalIndex ), создавая редактор над указанной секцией.

Редактором тогда будет какой-нибудь QLineEdit, через installEventFilter получающий фильтр, который должен будет ловить нажатия Enter, Esc и т.д., подтверждая изменения через QSqlQueryModel::setHeaderData() например, и/или уничтожая редактор.

При изменении ячейки мне нужно проверить, что введено число


Если для указанного QLineEdit при создании вызвать setValidator( new QIntValidator( this ) ), то ввести туда можно будет только целое число.

summatus
()
Ответ на: комментарий от azure

Спасибо. Я создал делегата, у которого в качестве редактора используется QDoubleSpinBox. Это решило проблему фильтрации ввода автоматически.

ecnpyt
() автор топика
Ответ на: комментарий от summatus

Да, спасибо за подсказки.
Из QTableView я смог получить QHeaderView. И соединить сигнал sectionDoubleClicked ( int logicalIndex ) со своим слотом.

Но как создать над заголовком редактор пока не понял.

ecnpyt
() автор топика
Ответ на: комментарий от ecnpyt

Пока что я сделал проще... При нажатии на заголовок появляется диалог со строкой ввода. А потом я просто устанавливаю новое имя.
Вот кусочек кода из слота:
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
() автор топика
Ответ на: комментарий от ecnpyt

>Но как создать над заголовком редактор пока не понял.

Потомок будет нарисован в родителе, если это указать, например, при его создании. Т.к. QHeaderView - часть QTableView, то если указать таблицу в качестве parent для любого виджета, он будет в ней нарисован.

Для позиционирования редактора в заголовке, видимо, придётся его помещать в какой-нибудь layout, а сам layout создавать в таблице. Методом QXXXLayout::addSpacing, задавать смещение редактора. Нужное смещение и ширину можно узнать при помощи QHeaderView::sectionSize().

Вообще правильный путь в твоём случае - наследовать QHeaderView -> EditableHeaderView, и переопределять методы обработки событий мыши и отрисовки. То что я предлагаю, в сравнении с этим - костыль.

summatus
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.