Russian Qt Forum

Qt => Вопросы новичков => Тема начата: AlexZ от Апрель 11, 2017, 18:41



Название: Реализация блоков для визуального программирования
Отправлено: AlexZ от Апрель 11, 2017, 18:41
Всем привет. С помощью чего лучше реализовать блоки для визуального программирования? Например как тут (https://www.youtube.com/watch?v=pOgaVxv6Llw&t=36s).
1. Если через QGraphicsObject, то как можно в блок вставить QLineEdit и другие виджеты?
2. Возможно ли это сделать создав свой виджет? И если да, то как запихать его в что-то типа QGraphicsScene?


Название: Re: Реализация блоков для визуального программирования
Отправлено: gil9red от Апрель 11, 2017, 20:29
Порядок действий:
  • На видео открываем развернуть
  • Ищем ссылку на исходный код
  • ...
  • Ссылка: https://bitbucket.org/ilgarlunin/nodes.git

 ;D

В описании того репозитория была ссылка на русскоязычную статью о том как автор разрабатывал: http://ilgarlunin.blogspot.ru/2015/09/blog-post.html


Название: Re: Реализация блоков для визуального программирования
Отправлено: AlexZ от Апрель 12, 2017, 06:53
Спасибо за ответ. Ссылки видел, но статью как-то проглядел. Появились еще вопросы:
1. Насколько Qt для питона отличается от Qt для C++?
2. Из статьи не понятно как автор запихал в ноды Qt-ые виджеты. И правильно ли он делал?

Собственно мне нужно реализовать ноды, которые можно было бы запихать в QGraphicsScene и которые бы поддерживали Qt-ые виджеты(QLineEdit и т.д.). Хотелось бы узнать мнение у местных старожил, с помощью чего правильно это сделать и в какую сторону копать.

P.S. На сколько я понял из других тем, то можно попробовать через QGraphicsProxyWidget.


Название: Re: Реализация блоков для визуального программирования
Отправлено: gil9red от Апрель 12, 2017, 07:35
1. Ничем. Тот же Qt, но с привязкой к питону. Даже Qt'шные dll'ки можно найти (https://bitbucket.org/ilgarlunin/nodes/src/c26742c9492041d636143b4a0848d1c30952ba97/Python27/Lib/site-packages/PySide/?at=master)


Название: Re: Реализация блоков для визуального программирования
Отправлено: Zerkin от Апрель 12, 2017, 12:10
Прокси виджеты, вы копаете в правильную сторону.


Название: Re: Реализация блоков для визуального программирования
Отправлено: Day от Апрель 12, 2017, 15:39
Что-то в таком роде
Код:
   QLineEdit *LE = new QLineEdit();
   QGraphicsProxyWidget *gpw = scene->addWidget(LE);
И дальше работаете с gpw.


Название: Re: Реализация блоков для визуального программирования
Отправлено: AlexZ от Апрель 15, 2017, 11:38
Всем спасибо за ответы и помощь. В общем для теста сделал так:

Отнаследовался от QGraphicsProxyWidget:

.h файл
Код:
#include <QGraphicsProxyWidget>

class CustomWidget : public QGraphicsProxyWidget {

Q_OBJECT

public:

explicit CustomWidget(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0);
~CustomWidget();

signals:

public slots:
};

.cpp файл
Код:
#include "customwidget.h"

#include <QLineEdit>

CustomWidget::CustomWidget(QGraphicsItem * parent, Qt::WindowFlags wFlags) : QGraphicsProxyWidget(parent, wFlags) {

QLineEdit * lineEditWidget = new QLineEdit();
this->setWidget(lineEditWidget);
this->setPos(10, 10);
}

CustomWidget::~CustomWidget() {

}

появились 2 проблемы:
1. Когда перемещаешь графический объект за границы view, а потом скроллом перемещаешь view на графичекий объект, то возникают глюки с отрисовкой. Перерисовывается только графический объект, а виджет нет. И такое ощущение, что перерисовка идет поверх старого объекта , ибо по обводке можно заметить, что ее толщина в некоторых местах разная. Причем с объектом, который был заспавнен на сцену первым, все нормально. скриншот (https://i89.fastpic.ru/big/2017/0415/e6/bf0e1a00eeff1491078c115be8b605e6.jpg).
2. После действий связанных с ресайзом окон появляются также баги с отрисовкой. скриншот (https://i91.fastpic.ru/big/2017/0415/fa/1ed28f5227535defcec4793dc6bb2cfa.jpg).

Код добавления графического блока:
Код:
void MainWindow::on_addBlock_clicked() {

Block * item = new Block;

item->setPos(randomPos(30, 230), randomPos(30, 230));
item->setFlags(QGraphicsItem::ItemIsMovable);
scene->addItem(item);

CustomWidget * widget = new CustomWidget(item);
}

Подскажите пожалуйста, как исправить отрисовку? Может нужно еще какой-нибудь метод перегрузить у прокси виджета?


Название: Re: Реализация блоков для визуального программирования
Отправлено: lit-uriy от Апрель 20, 2017, 07:32
В блоге Qt было упоминание того, что виджеты воткнутые в графическую сцену - ересь, которой не следует пользоваться. И сделана она была необдуманно под давлением общественности.

П.С.
Я перестал делать наследников QGraphicsProxyWidget, т.к. это довольно часто приводит к глюкам. Просто добавляю виджеты через QGraphicsProxyWidget.


Название: Re: Реализация блоков для визуального программирования
Отправлено: Igors от Апрель 20, 2017, 11:42
Лично я не увидел здесь особых выгод QGraphicsScene и реализовал подобную задачу на QPainter. В любом случае больное место - размещение "блоков", напр чтобы воткнуть новый юзеру приходится делать массу телодвижений (куда-то подвинуть имеющиеся и.т.п)