Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets > QHeaderView: как убрать нумерацию строк в вертикальном заголовке таблицы? |
Автор: vlad2 20.05.24, 09:21 |
Точнее: можно ли убрать текст (нумерацию строк) в вертикальном заголовке таблицы без полной ручной перерисовки ячейки в переопределённой функции paintSection класса QHeaderView? Спасибо. |
Автор: Majestio 21.05.24, 06:01 |
vlad2, присоедини свой пример |
Автор: vlad2 21.05.24, 07:01 |
Да тот же самый, в этой ветке. Это вопрос на знание: если есть 2-3 функции, которые мне неизвестны, это одно, а если десятки строк кода, то проще отрисовать всю ячейку самому. Смысл в том, что ячейка вертикального заголовка должна быть пустой, либо с картинкой. Поэтому думал при помощи какой-то функции убрать текст или задать его пустым, а потом нарисовать или нет на этом месте картинку. Без полной ручной отрисовки. Только и всего. |
Автор: Majestio 21.05.24, 09:54 |
Ну, ручная отрисовка - это самое последнее дело, что нужно использовать. Т.к. теряется "стильность" при создании кросс-платформенных приложений. Пользователь ожидает оформление выбранной им темы, а ему "рисуют". Иными словами, когда вообще край - только тогда рисуй самостоятельно. Допустим, вывод изображения в ячейке потребует рисования, во всех остальных случаях лучше обойтись другими способами. Ну и по твоему вопросу этой темы ... 1) Ты можешь вообще спрятать вертикальный заголовок: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> tableView->setVerticalHeaderVisible(false); 2) Ты можешь выводить произвольный текст, но откуда ты его возьмешь? Правильно - из твоей модели! Ведь там, и только там находятся (или вычисляются на-лету) данные для отображения. Поэтому дополни/скорректируй поведение своей модели. Например: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> #include <QAbstractTableModel> #include <QVariant> class MyModel : public QAbstractTableModel { public: int rowCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent) return 0; // Замени на количество строк в твоей модели данных } int columnCount(const QModelIndex &parent = QModelIndex()) const override { Q_UNUSED(parent) return 1; // Замени на количество столбцов в твоей модели данных } QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override { if (orientation == Qt::Vertical && role == Qt::DisplayRole) { // Получаем данные из твоей модели данных // Здесь предполагается, что у тебя есть метод data() для получения данных // Замени на соответствующий код для твоей модели данных QVariant data = data(index(section, 0), Qt::DisplayRole); // Тут синтетический пример вычисления текста ячейки вертикального заголовка на основе данных QString text = (data.toInt() > 0) ? "+" : "-"; return text; } return QAbstractTableModel::headerData(section, orientation, role); } QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override { Q_UNUSED(index) Q_UNUSED(role) // Замени на соответствующий код для твоей модели данных return QVariant(); } }; В приведенном примере в ячейках вертикального заголовка будет выводится минус или плюс в зависимости от данных, хранимых в твоей модели (где-то как-то это уже второй вопрос) 3) Чтобы вместо текста рисовать картинку нужен немного другой подход - модификацию делегата, например: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> void MyDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { if (index.column() == 0 && index.row() < model->rowCount()) { QString text = model->data(index, Qt::DisplayRole).toString(); painter->drawText(option.rect, text); // тут "рисуется" текст, но можно рисовать и картинку } else { QStyledItemDelegate::paint(painter, option, index); } } Работу с моделями и делегатами я тебе показывал в моем тестовом проекте, который я тебе оставлял. Ну и небольшое замечание: сорян, приведенные куски кода я не проверял - просто спросил у ChatGPT. Его ответы меня устроили, т.к. я помню, что такое делал когда-то сам. Ну а сидеть тестить и экспериментировать желания нет. Считаю, что самое главное - это показать куда "правильно копать" |
Автор: vlad2 21.05.24, 10:37 |
Спасибо, буду смотреть. |