Как стать автором
Обновить
0
0
Денис @puzon4eg

Пользователь

Отправить сообщение

вы не наследует приватный класс QAbstractViewItemPrivate

Это да. Просто не совсем понятно, зачем его наследовать то? Виртуальных методов там нет. То есть я лично вижу 2 варианта:

1) Можем либо только что-то свое добавить. А смысл?

2) Либо изменить имеющиеся реализации. Но это приведет к тому, что придется еще и поддержать Qt'шные классы.

QTableView использует QAbstractViewItemPrivate. Для своего же класса, наследованного от QTableView, можете аналогично сделать приватный класс с требуемым функционалом. Аналогично как это и делает сам Qt.

Я правда не совсем понимаю необходимость создания таких приватных секций. Мне они в Qt доставляют только лишний гемор. Я решал схожую с вашей задачу и мне было проще переопределить нужные мне виртуальные функции. Но этот огрызок в приватной части, все равно остается, только уже мертвым грузом, который не выкинуть, но и его функционал мне не подходит.

Поэтому мне и интересно, зачем оно вам)

Доброго времени. Будет много букв.

А по другому не получается, то есть сделать чисто открытое наследование от QAbstractItemView можно, оно скомпилируется, но при сборке линковщик не найдет методы QAbstratItemViewPrivate

Не совсем понятно, что не получается? Если вы используете только члены и функции класса QAbstractItemView, то никакой проблемы нет при наследовании. Если же вы пытаетесь также использовать что-то из QAbstratItemViewPrivate, то полученный вами результат логичен.

Если кто знает как можно сделать свой класс , уналедованный от QAbstractItemView, чтобы можно было свободно его распространять без необходимости лезть в исходники Qt - буду безмерно признателен...

Вот пример наследования (да, пример на Qt5, но сути не меняет):

//myview.h
#include <QAbstractItemView>

class MyView : public QAbstractItemView
{
    Q_OBJECT
    Q_DISABLE_COPY(MyView)

public:
    MyView(QWidget *parent = nullptr);
    ~MyView(){}

    // QAbstractItemView interface
public:
    virtual QRect visualRect(const QModelIndex& index) const override;
    virtual void scrollTo(const QModelIndex& index, ScrollHint hint) override;
    virtual QModelIndex indexAt(const QPoint& point) const override;

protected:
    virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
    virtual int horizontalOffset() const override;
    virtual int verticalOffset() const override;
    virtual bool isIndexHidden(const QModelIndex& index) const override;
    virtual void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command) override;
    virtual QRegion visualRegionForSelection(const QItemSelection& selection) const override;
};

//myview.cpp
MyView::MyView(QWidget* parent)
    : QAbstractItemView(parent)
{
}

QRect MyView::visualRect(const QModelIndex& index) const
{
    return QRect();
}

void MyView::scrollTo(const QModelIndex& index, ScrollHint hint)
{
}

QModelIndex MyView::indexAt(const QPoint& point) const
{
    return QModelIndex();
}

QModelIndex MyView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
{
    return QModelIndex();
}

int MyView::horizontalOffset() const
{
    return 0;
}

int MyView::verticalOffset() const
{
    return 0;
}

bool MyView::isIndexHidden(const QModelIndex& index) const
{
    return false;
}

void MyView::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command)
{
}

QRegion MyView::visualRegionForSelection(const QItemSelection& selection) const
{
    return QRegion();
}

Все спокойно собирается и работает.

Большинство классов Qt имеют внутри приватные части, в которых и прячется "логика" этих классов. Такие классы имеют в конце приписку Private. Вы никогда от других классов, кроме QAbstractItemView, не наследовались? Даже у QWidget есть такой класс - QWidgetPrivate.

С другой стороны один раз сделав сборку из исходников понимаешь, что процесс добавления своего функционала внутрь, отладка, сборка совсем не трудные операции

Конечно, не трудные. К тому же в нете достаточное количество мануалов по этому поводу, не говоря уже про наличии официального мануала от Qt.

Другое дело, сборка занимает сравнительно много времени и ресурсов на диске. Году так в 2015 у меня сборка Qt4.8.7 занимала ~2 часа времени, сейчас конечно намного быстрее. А по размеру - сейчас, например, сборка Qt6.6 в статик и debud_and_release занимает порядка 80Гб.

Тут используется таймер потому, что в событии moveMouseEvent нельзя сразу отрисовывать таблицу или хэдер.

Можно, кто ж запрещает то? Другое дело, что движение мыши по таблице вызывает ее перерисовку..

По поводу делегатов, то тут все просто: делегату передается прямоугольник ячейки и далее делегат сам все отрисовывает в ячейке как ему надо. Это про комбобоксы, всякие чекбоксы и т.д.

Это не только комбобоксы, всякие чекбоксы и т.д. Делегаты занимаются как раз отрисовкой всего содержимого ячейки для соответствующего QModelIndex. С помощью них можете все что угодно рисовать внутри ячеек. Даже то же, что вы описываете во второй части статьи.

Оказывается если мы видим через qDebug() такое: QRect(0,0 101x101) и вроде бы ширина (и высота) равны 101. Но самом деле это означает реально ширину (или высоту) 100px.

Я тут выше в своем комментарии несколько ошибся. Правильно так вычисляется ширина:

inline int QRect::width() const
{ return  x2 - x1 + 1; }

Почему именно так, то полагаю это из-за того, как происходит отрисовка. Это хорошо описано в доке и даже с картинками.

Ну и под конец -

фреймворк Qt и последние 10 лет ничего почти в нем не менялось.

тут вроде много Вам примеров привели, что поменялось и довольно существенно.

Так, например, в Qt5 кардинально пересмотрели работы мета-объектной сисиемы и moc-компилятора. В связи с чем перешли на новую сигнатуру функций QObject::connect(...). Как результат: теперь о невозможности произвести коннект разработчик узнает на этапе сборки проекта.

Дополню о Qt6.

С версии Qt6.5 под Win 11 начали использовать новое апи. И теперь стала возможна нативная поддержка системных темных тем, без танцев с бубном, так и переключение "день\ночь" при соответствующем переключении системной темы. Подробнее на их сайте Dark Mode on Windows 11 with Qt 6.5

Согласно документации, ширина вычисляется как (х2-х1)-1

Информация

В рейтинге
Не участвует
Откуда
Санкт-Петербург, Санкт-Петербург и область, Россия
Дата рождения
Зарегистрирован
Активность