Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата Majestio @
присоедини свой пример
Да тот же самый, в этой ветке.
Это вопрос на знание: если есть 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
Цитата Majestio @
Работу с моделями и делегатами я тебе показывал
Спасибо, буду смотреть.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)