Russian Qt Forum
Ноябрь 27, 2024, 14:51 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Редактирование элемента на qwidget и ещё кое-что.  (Прочитано 7665 раз)
luzhskij
Гость
« : Февраль 03, 2016, 09:46 »

Здравия.

Возник затык Непонимающий

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

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

Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Февраль 03, 2016, 10:33 »

Встроенных средств нет ,надо свой редактор писать.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
luzhskij
Гость
« Ответ #2 : Февраль 03, 2016, 10:42 »

А что вы имеете ввиду под "собственный редактор"?
Приведу пример. Создаю класс наследник от QGraphicsRectItem. Создаю виджет, с полями угол наклона, цвет, заливка. И связываю этот виджет со своим классом. Т.е. при изменении элемента принадлежащего этому классу посылается сигнал и происходит перерисовка элемента на сцене.
Выходит , что для того чтобы иметь редактируемые элементы, нужно для каждого типа элементов(точка, линия, полигон) создавать класс наследник? Но это в случае со сценой.
А как же в случае виджета?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Февраль 03, 2016, 11:31 »

У меня встречный вопрос - что вы понимаете под "редактированием"?
Это только изменение параметром?
Или полноценное изменение геометрии "мышом"?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
luzhskij
Гость
« Ответ #4 : Февраль 03, 2016, 11:40 »

У меня встречный вопрос - что вы понимаете под "редактированием"?
Это только изменение параметром?
Или полноценное изменение геометрии "мышом"?


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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 03, 2016, 12:13 »

Например, нарисовали на виджете линию (painter.drawLine(QLineF(0, 0, 5, 6)), но хотим изменить ее цвет.
Нужно опять нарисовать эту же линию, но др цветом. Отсюда следует что (0, 0, 5, 6) надо где-то хранить.

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

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

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #6 : Февраль 05, 2016, 10:45 »

Тут есть реализация. http://qt-apps.org/content/show.php/?content=68684
ПС. Визуальное редактирование предпочтительнее в случае графических объектов.
Графические характеристики в таблице править - это мазохизм для пользователя.
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Февраль 05, 2016, 11:53 »

Тут есть реализация. http://qt-apps.org/content/show.php/?content=68684

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

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 05, 2016, 11:58 »

Это посвежее и постабильнее будет: http://sourceforge.net/projects/qsint-properties
Народная примета: если увидели saturation 100% - дальше смотреть не стоит  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #9 : Февраль 05, 2016, 12:02 »

Это посвежее и постабильнее будет: http://sourceforge.net/projects/qsint-properties
Народная примета: если увидели saturation 100% - дальше смотреть не стоит  Улыбающийся

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

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
luzhskij
Гость
« Ответ #10 : Февраль 05, 2016, 12:29 »

Тут есть реализация. http://qt-apps.org/content/show.php/?content=68684
ПС. Визуальное редактирование предпочтительнее в случае графических объектов.
Графические характеристики в таблице править - это мазохизм для пользователя.

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

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

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


Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #11 : Февраль 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);

Ну и реализовать эти методы.
« Последнее редактирование: Февраль 05, 2016, 15:00 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
luzhskij
Гость
« Ответ #12 : Февраль 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()
Но что же дальше?

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

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #13 : Февраль 05, 2016, 16:06 »

Im sory, я с графической сценой практически не работал Грустный
Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #14 : Февраль 05, 2016, 16:09 »

ну явно должно быть что-то типа scene->itemAtPoint() — туда параметром и скормить event->pos()
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.056 секунд. Запросов: 23.