Qt: окно с подвижными виджетами
Я хочу создать окно с переменным количеством пользовательских виджетов, каждый из виджетов может быть группой из нескольких простых объектов. Виджеты должны вести себя подобно диалоговым окнам: они могут быть перемещены в любое место внутри родительского окна, могут перекрываться и т. Д. Однако они не могут быть перемещены из окна. Что было бы наиболее подходящим способом реализовать что-то подобное в QT3? Я попытался создать окна / диалоговые окна с основным окном в качестве родительского, но таким образом виджеты могут быть перемещены из окна.
1 ответ
Возможно, вы сможете использовать функцию перетаскивания. Это единственное, о чем я могу думать.
Есть пример, который поставляется с Qt, называемый Fridge Magnets. По сути, они создали класс DragWidget, который является хостом для всех других виджетов. В этом примере они создают множество QLabels со словами, которые пользователь может перетаскивать для создания предложений.
Основная работа заключается в реализации следующих функций.
void dragEnterEvent(QDragEnterEvent *event);
void dragMoveEvent(QDragMoveEvent *event);
void dropEvent(QDropEvent *event);
void mousePressEvent(QMouseEvent *event);
Этот пример был представлен с Qt4, но он должен дать вам идею, код здесь
Обычно при нажатии мыши элемент управления под мышью скрывается, а изображение помещается в данные перетаскивания. Когда пользователь удаляет его где-то в элементе управления, пример закрывает его в предыдущем месте, создает новый QLabel и помещает его туда, куда упал пользователь. Вы, вероятно, должны изменить это, чтобы просто переместить свой контроль в это место.
В примере используются несколько концепций, которые немного отличаются от того, что было доступно в 3.3, поэтому вот пример перетаскивания из 3.3
Основная проблема заключается в том, что показывать, когда пользователь перемещается. В первом примере они используют хороший трюк для создания изображения метки, поэтому действительно похоже, что пользователь перетаскивает виджет вокруг.
Очевидно, было бы намного проще использовать функциональность MDI в Qt4, но если это не вариант, это единственное, о чем я могу думать.
Надеюсь, это поможет.