Russian Qt Forum

Qt => Вопросы новичков => Тема начата: luzhskij от Февраль 03, 2016, 09:46



Название: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: luzhskij от Февраль 03, 2016, 09:46
Здравия.

Возник затык ???

1) Как отредактировать нарисованную на виджете линию/полигон/точку и т.п.
Например, нарисовали на виджете линию (painter.drawLine(QLineF(0, 0, 5, 6)), но хотим изменить ее цвет. В голову приходит использование метода mousePressEvent, но вот что дальше делать?..

2) А второй вопрос по сцене. Содержание похожее, как отредактировать элемент на сцене (scene->addLine(QLineF(0, 0, 5, 6))) ?



Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Racheengel от Февраль 03, 2016, 10:33
Встроенных средств нет ,надо свой редактор писать.


Название: Re: Редактирование элемента на qwidget и ещё кое-что
Отправлено: luzhskij от Февраль 03, 2016, 10:42
А что вы имеете ввиду под "собственный редактор"?
Приведу пример. Создаю класс наследник от QGraphicsRectItem. Создаю виджет, с полями угол наклона, цвет, заливка. И связываю этот виджет со своим классом. Т.е. при изменении элемента принадлежащего этому классу посылается сигнал и происходит перерисовка элемента на сцене.
Выходит , что для того чтобы иметь редактируемые элементы, нужно для каждого типа элементов(точка, линия, полигон) создавать класс наследник? Но это в случае со сценой.
А как же в случае виджета?


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Racheengel от Февраль 03, 2016, 11:31
У меня встречный вопрос - что вы понимаете под "редактированием"?
Это только изменение параметром?
Или полноценное изменение геометрии "мышом"?


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: luzhskij от Февраль 03, 2016, 11:40
У меня встречный вопрос - что вы понимаете под "редактированием"?
Это только изменение параметром?
Или полноценное изменение геометрии "мышом"?


Для начала - изменение некоторых параметров. Допустим будет у нас пара-другая QSpinBox, в которых можем выбрать цвет, тип линии, штриховки. И есть полигон. Ткнули в него курсором и выбрали ему новый цвет заливки, штриховку.

А редактирование геометрии... Тоже хороший момент.

Придумал! А если создать некоторый TableView, где будет отображать каждый элемент, и в котором можно будет отредактировать точки, изменить цвет и т.п. ?
Возможно такое?
Тогда ткнули в объект - он выделился в таблице(или наоборот) и можно редактировать.
Тогда вопрос как такой тэйбл создать.%)
 


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Igors от Февраль 03, 2016, 12:13
Например, нарисовали на виджете линию (painter.drawLine(QLineF(0, 0, 5, 6)), но хотим изменить ее цвет.
Нужно опять нарисовать эту же линию, но др цветом. Отсюда следует что (0, 0, 5, 6) надо где-то хранить.

Ткнули в него курсором и выбрали ему новый цвет заливки, штриховку.
Сначала надо определить что ткнули именно в него - и это не так уж просто

Придумал! А если создать некоторый TableView, где будет отображать каждый элемент, и в котором можно будет отредактировать точки, изменить цвет и т.п. ?
Возможно такое?
Да, но придется попотеть. Субъективный совет: если опыта маловато - не хватайте QGraphicsScene, позанимайтесь "руками" (иначе они никогда не разовьются)


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: panAlexey от Февраль 05, 2016, 10:45
Тут есть реализация. http://qt-apps.org/content/show.php/?content=68684
ПС. Визуальное редактирование предпочтительнее в случае графических объектов.
Графические характеристики в таблице править - это мазохизм для пользователя.


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Racheengel от Февраль 05, 2016, 11:53
Тут есть реализация. http://qt-apps.org/content/show.php/?content=68684

Тыкал я его как-то, кривое старье :(
Это посвежее и постабильнее будет: http://sourceforge.net/projects/qsint-properties

И да, насчет таблицы - это таки мазохизм. Визуальный редактор, конечно, лучше.


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Igors от Февраль 05, 2016, 11:58
Это посвежее и постабильнее будет: http://sourceforge.net/projects/qsint-properties
Народная примета: если увидели saturation 100% - дальше смотреть не стоит  :)


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Racheengel от Февраль 05, 2016, 12:02
Это посвежее и постабильнее будет: http://sourceforge.net/projects/qsint-properties
Народная примета: если увидели saturation 100% - дальше смотреть не стоит  :)

Где там saturation 100% ??? Это редактор свойств типа дизигнера.


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: luzhskij от Февраль 05, 2016, 12:29
Тут есть реализация. http://qt-apps.org/content/show.php/?content=68684
ПС. Визуальное редактирование предпочтительнее в случае графических объектов.
Графические характеристики в таблице править - это мазохизм для пользователя.

Спасибо за пример! Тут как я вижу применяется QAbstractItemModel. Выходит, что если создать некоторый QAbstractItemView и объединить, то будет примерно то что мне и нужно, в простейшем варианте.

Только немного непонятным остаётся. В случае QGraphicsScene и QGraphicsView можем получить некоторый список items, которые сейчас на сцене.  А если мы объединим несколько, например, QGraphicsLineItem в QGraphicsItemGroup. Как его, QGraphicsItemGroup, редактировать? Или такой же подход как и с QGraphicsLineItem, т.е. наследуем и пишем нужные методы?

И как в случае использования qwidget получить аналогичный список элементов, расположенных на виджете.




Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: panAlexey от Февраль 05, 2016, 14:52
И как в случае использования qwidget получить аналогичный список элементов, расположенных на виджете.
Неправильная постановка вопроса.
Элементы не на виджете располагаются, элементы располагаются в структурах данных вашей программы. а а виджете они только отрисовываются.
Элементы хранят (минимум) размер и позицию.
И когда получаешь онмышаклик с координатами, тебе достаточно пробежать по списку виджетов и определить куда (в какой итем ты попал). Н и дальше работать с ним.

ПС. хотя я наверное не так понял.
Надо унаследоваться от QWidget и перегрузить методы:
Код:
class твойВиджет : public QWidget
{
    Q_OBJECT

    protected:

        void paintEvent(QPaintEvent *event);
        void contextMenuEvent(QContextMenuEvent *event);
void showEvent( QShowEvent* event );
void resizeEvent ( QResizeEvent * event );
void keyPressEvent ( QKeyEvent * event );
void wheelEvent ( QWheelEvent * event );
void focusInEvent ( QFocusEvent * event );
void focusOutEvent ( QFocusEvent * event );
        void mouseDoubleClickEvent( QMouseEvent * event );
        void mouseReleaseEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void mouseEventProcess(QMouseEvent *event, int evType = 0);

        void mousePressEvent(QMouseEvent *event);

Ну и реализовать эти методы.


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: luzhskij от Февраль 05, 2016, 15:19
И как в случае использования qwidget получить аналогичный список элементов, расположенных на виджете.
Неправильная постановка вопроса.
Элементы не на виджете располагаются, элементы располагаются в структурах данных вашей программы. а а виджете они только отрисовываются.
Элементы хранят (минимум) размер и позицию.
И когда получаешь онмышаклик с координатами, тебе достаточно пробежать по списку виджетов и определить куда (в какой итем ты попал). Н и дальше работать с ним.

ПС. хотя я наверное не так понял.
Надо унаследоваться от QWidget и перегрузить методы:
Код:
class твойВиджет : public QWidget
{
    Q_OBJECT

    protected:

        void paintEvent(QPaintEvent *event);
        void contextMenuEvent(QContextMenuEvent *event);
void showEvent( QShowEvent* event );
void resizeEvent ( QResizeEvent * event );
void keyPressEvent ( QKeyEvent * event );
void wheelEvent ( QWheelEvent * event );
void focusInEvent ( QFocusEvent * event );
void focusOutEvent ( QFocusEvent * event );
        void mouseDoubleClickEvent( QMouseEvent * event );
        void mouseReleaseEvent(QMouseEvent *event);
        void mouseMoveEvent(QMouseEvent *event);
        void mouseEventProcess(QMouseEvent *event, int evType = 0);

        void mousePressEvent(QMouseEvent *event);

Ну и реализовать эти методы.



Да, это понятно. На данный момент не понимаю следующее, а именно:
1) Вернемся к сцене. Чтобы обратиться к выделенному итему используем
Код:
QList<QGraphicsItem*> items = scene->selectedItems();
И можем получить свойства этого итема, как следствие и отредактировать что-либо.
2) Как реализовать подобное с QWidget? Хорошо, переопределили
Код:
void mousePressEvent(QMouseEvent *event);
далее ткнули мышкой в элемент, получили, например,
Код:
event->pos()
Но что же дальше?

Дальше, получается, при помощи делегатов можно будет производить какие-то действия с выбранным элементом (т.е. что-то похожее на примеры, приведенные выше), но как на него указатель-то получить????
 
Прошу прощения, коль вопросы сформулированы не очень чётко. Сумбур в голове%)


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: panAlexey от Февраль 05, 2016, 16:06
Im sory, я с графической сценой практически не работал :(


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: kambala от Февраль 05, 2016, 16:09
ну явно должно быть что-то типа scene->itemAtPoint() — туда параметром и скормить event->pos()


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: luzhskij от Февраль 05, 2016, 16:59
ну явно должно быть что-то типа scene->itemAtPoint() — туда параметром и скормить event->pos()

Это если по сцене клик. А если по qwidget? А если
Код:
painter.drawEllipse(5, 5, 5, 5)
Как отследить клик по этому объекту%)


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: Igors от Февраль 05, 2016, 17:04
Цитированием не злоупотребляйте
2) Как реализовать подобное с QWidget? Хорошо, переопределили
Код:
void mousePressEvent(QMouseEvent *event);
далее ткнули мышкой в элемент, получили, например,
Код:
event->pos()
Но что же дальше?
Дальше надо проверить все структуры данных которые соответствуют нарисованному. Напр есть полигон - проверить может event->pos() внутри него. Причем с учетом масштаба как он отрисован (там вместо полигона может быть аж точка). Причем с каким-то запасом - юзер не обязан точно попадать. И так для всего что нарисовано.

Дальнейший ход мыслей понятен: "ой, это так сложно, возьму-ка я готовый классик который за меня это все сделает, (напр QGraphicsScene)". Хотите - берите, но помните что говорила сестрица Аленушка
Цитировать
Не пей воды - козленочком станешь
:)


Название: Re: Редактирование элемента на qwidget и ещё кое-что.
Отправлено: luzhskij от Февраль 08, 2016, 08:32
Да нет, звучит не сложно. Вот действительно же затупил, просто проверить координаты точки на совпадение с координатами объектов! Для выделения можно, например, маску сверху рисовать. А для удаления, коррекции цвета - изменять значения в структуре данных и потом перерисовывать рабочую область.
 
Благодарю за ответы. На пока что вопросы исчерпались=)