LINUX.ORG.RU

Проектирование Qt-приложения. Связь QListWidget и QVector

 , ,


0

2

У меня есть структура, содержащая информацию об виджете-объекте pObj и указатель на него

 typedef struct {
    QPointF p1;
    QPointF p2;
    QString name;
    QWidget *pObj;
} TMyObj;

Эти структуры складываются в

QVector<TMyObj> myStructArr

Есть необходимость выводить эти структуры (и взаимодействовать с ними) через QListWidget - то есть заполнить его значениями вектора myStructArr и обрабатывать его события, получая связанные с ними элементы вектора.

Когда-то давно (когда я писал на Delphi) я просто заполнял QListWidget элементами QListWidgetItem а при клике получал номер выбранного элемента i = QListWidget::selected() и нужный мне элемент находил в векторе: MyEl = myStructArr[i].

Но, мне кажется что здесь нужно немного ООП.

Например, создать классы:
- MyListWidgetItem наследующийся от QListWidgetItem и содержащий в себе эту структуру.
- MyListWidget наследующийся от QListWidget и добавить метод, возвращающий структуру из MyListWidgetItem

Как вообще это делается в цивилизованном мире?

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


 typedef struct {
    QPointF p1;
    QPointF p2;
    QString name;
    QWidget *pObj;
} TMyObj;

Зачем эта структура? В QObject есть замечательная вещь QObject::setProperty, храни все что хочешь. В итоге тебе не нужна структура, нужен тупо список виджетов.

Есть необходимость выводить эти структуры (и взаимодействовать с ними) через QListWidget - то есть заполнить его значениями вектора myStructArr и обрабатывать его события, получая связанные с ними элементы вектора.

Вот тут вообще непонятно, что ты хочешь в итоге.

grondek
()

Ты хочешь QListView и унаследоваться от QAbstractTableModel. (Если, конечно, не список виджетов нужен).

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от grondek

И ты в курсе, что QListWidget - это не список виджетов, а совсем-совсем другое?

Да, конечно. Я даже знаю как он выглядит.

Вот тут вообще непонятно, что ты хочешь в итоге.

Мне нужно реализовать работу с некоторым количеством виджетов одного типа. И добавить в программу QListWidget содержащий их. Под ним будут кнопки управления - «добавить новый» и «удалить выделенный».

Например, я делаю карту. Как гугл-мэпс. У меня есть Точки на этой карте - мои объекты. Я создаю структуру

 typedef struct {
    QPointF p1;    // координаты точки
    QPointF p2;    // не важно что
    QString name;  // текст, написанный над точкой
    QWidget *pObj; // указатель на экземпляр точки
} TMyObj;
и пихаю её в QVector. И хочу чтобы она отобразилась в QListWidget. А когда я запихаю ещё одну в QVector я хочу чтобы они обе там отобразились.

И когда я нажму на одну из точек в QListWidget, я хочу получить элемент этого QVector'а - ту структуру-точку на которую я нажал.

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

Можно поточнее описание?

Потому что карту через QListWidget не сделать - для нее есть QGraphicsView.

QListWidget - «отображатель» одного столбца данных, виджет, сделанный для упрощенной работы вместо пары QAbstractItemModel и QListView.

В Qt тебе не нужна описанная структура. Эти данные прекрасно можно хранить в виджетах, как я уже сказал, задавая setProperty( имя, значение ).

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

Не правильно описал. Карту рисую на канве (QCanvas). Точки - это объекты (наследуются от QWidget) myPoint. А слева от канвы хочу иметь список точек на этой карте. Этот список мне и нужен в виде одного столбца данных (QListWidget). И чтобы когда я кликал по элементу списка, я мог получить указатель на myPoint

Про setProperty я понял - спасибо. Но, все равно вопрос актуален - как хранить данные в QListWidget?

В любом случае, у меня есть массив указателей на мои точки: QVector <myPoint *> myPointArray

Первый вариант:

foreach (myPointArray as pt) {
    QListWidget::addItem(pt->name)
}
А при клике на QListWidget брать i = QListWidget::selected() и нужный элемент находится в векторе: myPoint *clickedPoint = myPointArray[i].

Второй вариант:
MyListWidget - наследую от QListWidget

foreach (myPointArray as pt) {
    MyListWidget::addItem(pt) //оно само берет свойство name
}
А при клике будет просто myPoint *clickedPoint = MyListWidget::selectedPoint

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

QCanvas? У тебя Qt3?

Если Qt4 и выше, то надо использовать QGraphicsView и QGRaphicsItem'ы на нем. Погляди в примерах, что там можно реализовать на них.

То есть у тебя есть список объектов в QListWidget( лучше все-таки QStandardModel + QListView (или QTreeView если иерархичная структура ) ) и сопоставленный им список объектов в QGraphicsView. Отдельно списки хранить нигде не надо, есть QGraphicsScene::items(...). Данные в модели и на QGraphicsItem сопоставляются например по уникальным идентификаторам.

QGraphicsItem можно выбирать мышкой, двигать.

P.s. В QGrapicsView можно втыкать любые виджеты, см. QGRaphicsWidget.

grondek
()
Последнее исправление: grondek (всего исправлений: 1)
Ответ на: комментарий от grondek

QCanvas? У тебя Qt3?

Нет =)
QCanvas - это было «например». На самом деле, технология не очень важна, я спрашиваю про архитектуру. Лично у меня это график - QwtPlot. У него есть свои штуки-точки - QwtPlotMarker. Вот мне нужно оперировать их списком в QListWidget слева от диаграммы.

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

Если так, то, например, у QwtPlot есть метод infoToItem( QVariant ). Вот этот QVariant ты и получаешь из QListWidget по выбору элемента. Хранить его можно в QListWidgetItem::data()

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

То есть общий принцип такой: в QListWidgetItem::data() ты хранишь идентификатор, позволяющий найти объект среди объектов на QwtPlot, QgraphicsView и т.д.

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

Только аккуратнее с ним - судя по описанию - это тупо указатель, кастанутый в QVariant. Удаляй аккуратно.

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

Это псевдокод. Я знаю как пишется Qtшный foreach.

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

Спасибо! Что можете посоветовать почитать по Qwt? Просто доки я читаю сейчас, хотелось бы книгу или туториал.

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