Pull to refresh
3
0
Павел @kkmspb

фулстек разработчик С, С++,PHP,JS

Send message

Да согласен с конструкторами не корректно написал. Вот два конструктора public и второй protected:

MyView::MyView(QWidget *parent) // public 
    :
    QAbstractItemView( *new MyViewPrivate, parent) // ошибки линковки !!!!!!
    // myview.obj:-1: error: LNK2001: unresolved external symbol 
 // "public: virtual void __thiscall QAbstractItemViewPrivate::_q_rowsRemoved(class QModelIndex const &,int,int)" (?_q_rowsRemoved@QAbstractItemViewPrivate@@UAEXABVQModelIndex@@HH@Z)
{
    setSelectionMode( QAbstractItemView::SingleSelection );

}

MyView::MyView(MyViewPrivate &dd,  QWidget *parent) // protected
    : QAbstractItemView(dd, parent)
{
    Q_D(MyView);

}

MyView::~MyView()
{

}

Это сделано как в QTableView в.т.ч. Но ошибки линковки присутствуют. Собственно откуда можно линковщику найти реализацию _q_rowsRemoved , в библиотеках Qt их нет (точнее они не экспортируемые).

new MyViewPrivate логично не слинкуется

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

Речь об этом примерно (myview.h):

#ifndef MYVIEW_H
#define MYVIEW_H

#include <QAbstractItemView>
//class QAbstractItemViewPrivate;
class MyViewPrivate;

class MyView : public QAbstractItemView
{
    Q_OBJECT
public:
    explicit MyView(QWidget *parent = 0);

    virtual ~MyView();

    // QAbstractItemView interface
public:

    virtual QRect visualRect(const QModelIndex& index) const;
    virtual void scrollTo(const QModelIndex& index, ScrollHint hint);
    virtual QModelIndex indexAt(const QPoint& point) const;

protected:
    virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);

    virtual int horizontalOffset() const;

    virtual int verticalOffset() const;

    virtual bool isIndexHidden(const QModelIndex& index) const;
    virtual void setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags command);
    virtual QRegion visualRegionForSelection(const QItemSelection& selection) const;

    
signals:
    
public slots:
    
private:
    Q_DECLARE_PRIVATE(MyView)
    Q_DISABLE_COPY(MyView)

};

#endif // MYVIEW_H

myview.cpp:

#include "myview.h"

#include <private/qabstractitemview_p.h>
#include "myview_p.h"

MyView::MyView(QWidget *parent) :
    QAbstractItemView(parent)
{
    setSelectionMode( QAbstractItemView::SingleSelection );

    Q_D( MyView );
    // !!  d->init();   ??????????????? выдает ошибку !!!!!
}

MyView::~MyView()
{

}

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

    return QRect();
}

..........

Не знаю как сюда подцепить файл с проектом, поэтому ссылка:

https://kkmspb.ru/development/Qt/private-classes-paradigma.php

Короче - почему не получается юзать приватный функционал Qt снаружи от исходников Qt

class MyView : public QAbstractItemView

Ваш пример конечно нормально собирается, но вы не наследует приватный класс QAbstractViewItemPrivate.

Соответственно тут нет проблем, но нет и смысла. Вам надо в своем cpp иметь доступ к методам приватного класса QAbstractItemView, чтобы использовать приватный функционал.

Вы сможете конечно сделать так в myview cpp:

Q_D(QAbstractItemView);

И сможете использовать конструкцию d-> . Но это не решит полностью проблему сборки вашего проекта.

У меня есть тестовый небольшой проект для этого, я постараюсь скинуть ссылку в ближайшее время.

Другое дело, сборка занимает сравнительно много времени и ресурсов на диске.

На самом деле gui ветка собирается минуту, если что-там немного подправить и минуты 4-5 полная переборка ветки.

Это про динамику (не статику)

Чтобы унаследовать QPTableView от QWidget (или QFrame), надо похоже ещё самому и QAbstractScrollArea реализовать. Задача не сложная, но оставим на будущее (а то так недолго и свой фреймворк написать)

Спс, интересно, там наследование прямо от QWidget

class QAIVLIBSHARED_EXPORT QAdvancedTableView : public QWidget

Такой вариант в голову ещё не приходил. И это хорошая идея.

Спс, посмотрим, такого не находил

Не получается пока никак без перекомпиляции. Мы наследуемся напрямую от QAbstractItemView (это для таблиц). У QAbstractItemView определен экспорт Q_GUI_EXPORT.
У QAbstractItemView есть приватный спутник QAbstractItemViewPrivate, в котором реализована часть функционала. У QAbstractItemViewPrivate экспорт отключен (см Q_AUTOTEST_EXPORT). Короче все методы QAbstractItemViewPrivate наружу в библиотеке не торчат, но QAbstractItemView их дергает. В общем штатно если вы унаследуетесь от QAbstractItemView вы не собирёте проект иначе как в составе исходников Qt. При линковке не найдены будут методы QAbstractItemViewPrivate .
Во всяком случае у меня никак не получается.

склеивает 3 (или N) столбца в один

Тут такой момент, что склеивая 3 и N столбца в один остаётся вопрос, а как теперь редактировать каждую иэ склеенных колонок (столбцов) ведь необходимость такая может быть. Склейка это span функционал в QTableView.

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

Я такого не встречал. Модель данных работает штатно как и раньше, ее не трогаем.

QTableView у нас полностью свой, но работает по старому принципу. Для каждого поля (колонки) модели данных мы задаём на вьюпорте прямоугольник, куда отрисовываем содержимое из модели данных. Располагать прямоугольники мы можем, где угодно.

В общем-то и все.

Насчёт редактирования, то при щелчке мыши на ячейке, мы имеем координаты клика, по которому определяем прямоугольник ячейки и номер строки/колонки (модели данных) и передаём делегату по умолчанию ( или вами переопределенному) координаты ячейки куда себя (делегата) отрисовать. Все просто.

Не надо я уже для себя все решил уже и другим предлагаю если интересно бесплатно воспользоваться, чувствуете разницу?

Я много-го не прошу сделайте, если знаете, демку с таким функционалом. Если не знаете не продолжайте.

Просто всё что связано с отображением данных на порядок проще делать средствами qml

Это кому как интереснее. Когда вы не сможете понять почему на Qml что-то не так как вам надо отрисовывается вы полезете отладчиком в исходники или смиритесь и оставите все как есть.

Вы лучше скажите, чем по вашему Qt4 лучше чем Qt6?

Вопрос абстрактный и бессмысленный уводящий во флуд. Я практик, мыслю категориями можно или нельзя.

И уже подозреваю на 99%, что в Qt6 ничего относительно QTableView не изменилось

Не совсем понял, что именно вы хотите увидеть.

Я про вывод колонок (модели данных) в строке таблицы по шаблону (многорядно).

Насколько я знаю qml это скриптовая оболочка, которая использует Q_PROPERTY классов С++. И если в классах не реализован какой-то функционал, то откуда в Qml он появится.

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

Соглашусь, но я бы назвал это зависимостью первого уровня, а от интерпретирования команд зависимостью второго уровня и т.д.

Подозреваю, что сам питон пишется на С++ , компилируется и линкуется под разные платформы.

Если вас 4-ка устраивает, то не вижу особых проблем, работает и ладно

Спасибо за ликбез. Действительно OpenGL, DirectX11, DirectX9 ничего такого пока не надо было. Графику svg Qt 4 умеет. HiDPI даже пока не понимаю зачем.

AvaloniaUI на C#, есть куча библиотек на питоне

Давайте ограничим список языком С++, открытыми исходниками и инструментом компилятор/линковщик. То что вы приводите уже интерпретаторы и вы становитесь заложником какой-то фирмы - будет она делать свою библиотеку кроссплатформенно? Ну например Microsoft? Уже звучит глупо.
Питон конечно кроссплатформенность будет поддерживать, но как и у любого интерпретатора если что-то заглючило, то ты заложник их ошибок. То есть тебя лишают свободы (образно говоря).
Кстати Delphi/Lazarus наверное хороший пример, там отрисовка нативная (насколько я помню), но begin/end просто невыносимо.

нет просто забыл как буква пишется

Information

Rating
Does not participate
Location
Парголово, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Fullstack Developer
Senior
From 250,000 ₽
OOP
Database
MySQL
PHP
C++
Programming microcontrollers
Qt
Software development
Development of drivers
C