Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: block от Апрель 03, 2013, 11:26



Название: Соединение виджетов
Отправлено: block от Апрель 03, 2013, 11:26
Всем привет)
Как можно соединить два виджета с помощью линии? Виджеты например это textEdit.
Запустили программу, показаны два виджета. Потом нажали на кнопку "Добавить линию" добавилась линия.
Думаю соединение сделать через чекбокс или просто наведением.
1) Если через наведение. Т.е. если навели с первого блока на второй, то два виджета соединились.
2) Если через чекбокс сделать. Если выделили два виджета, и нажали на кнопку "Добавить линию" , то виджеты соединились.
Потом двинули первый виджет, второй стоит на месте, и соединение прорисовывется.
Подскажите пожалуйста.)

Вот пример, соединение подобие этого хочу сделать,
http://doc.crossplatform.ru/qt/4.3.5/graphicsview-diagramscene.html,
только она через diagramsacene реализована.


Название: Re: Соединение виджетов
Отправлено: Fregloin от Апрель 03, 2013, 11:59
ну в целом все понятно, вам нужно на сцене разместить 2 GraphicsProxyItem, в них передаете указатели на нужные вам виджеты, размещаете где нужно, и добавляется QGraphicsLine или как то так, не помню, один конец в центр первого виджета, второй конец в центр второго, линию установить ниже всех через ZValue.
Если без сцены, тут уже сложнее, так как нужно будет переделать paintEvent формы, на которой ваши виджеты лежат, в целом как то так:
void paintEvent(painter)
{
  parentClass::paintEvent(painter) рисуются виджеты
  painter->drawLine(firstTextWidget.geometry().center(),secondTextWidget.geometry().center());
}
А также, если вы их тягаете по форме, нужно прорисовыать и линию в новых позициях.
Если я понял верно что вы хотели сделать именно так.


Название: Re: Соединение виджетов
Отправлено: block от Апрель 04, 2013, 11:50
Буду использовать QGraphicsProxyWidget с связкой QGraphicsScene, QGraphicsView.
Вот пример создания виджетов, один виджет просто через рисование сделан, другой через QTextEdit.
А теперь как сделать движение виджета QTextEdit. Хотелось бы движение при удержании левой кнопки мыши, в области QTextEdit.
Функция ItemIsMovable работает только с GraphicsItem.
Получается придется делать через событие mousePressed?



Код:
#include <QtGui>

int main(int argc, char *argv[])

{
    QApplication a(argc, argv);
    QGraphicsScene scene(QRectF(-100, -100, 300, 300));
    QGraphicsView view(&scene);
    QGraphicsRectItem* rectItem = new QGraphicsRectItem(0, &scene);
    rectItem->setPen(QPen(Qt::black));
    rectItem->setBrush(QBrush(Qt::green));
    rectItem->setRect(QRectF(-30, -30, 120, 80));
    rectItem->setFlags(QGraphicsItem::ItemIsMovable);
    QTextEdit* text = new QTextEdit();
    text->setFixedSize(100,30);
    text->setGeometry(-40,-70,100,30);
    QGraphicsProxyWidget* widgetItem = scene.addWidget(text);

    //widgetItem->setFlags(QGraphicsItem::ItemIsMovable); //вот так не работает..
    view.show();
    return a.exec();

}


Название: Re: Соединение виджетов
Отправлено: Fregloin от Апрель 09, 2013, 07:48
поищи тему, я когда то реализовал класс, который позволяет таскать по сцене обычные виджеты и менять их размеры