examples qt layout copy qobject

qt - examples - Mostrando el mismo QPushButton en mĂșltiples widgets



qpushbutton qt5 (5)

No pienses que puedes; un widget tiene solo un padre a la vez. Podrías moverlo con setParent () pero no mostrarlo simultáneamente en varios padres.

Tengo dos widgets (real y falso) y uno de ellos tiene un QPushButton. Ahora quiero que se muestre el mismo botón en el otro widget. ¿Cómo lo hago?

No quiero crear una copia, quiero que el mismo objeto QObject muestre otro widget al mismo tiempo sin cambiar el elemento principal.

Como ejemplo, en lo que sigue quiero que se muestre "mybutton" en ambos widgets al mismo tiempo;

QWidget *widgetReal = new QWidget(); QWidget *widgetFake = new QWidget(); widgetReal->setWindowTitle("Real"); widgetFake->setWindowTitle("Fake"); widgetReal->show(); widgetFake->show(); QGridLayout *layoutReal = new QGridLayout(); QGridLayout *layoutFake = new QGridLayout(); QPushButton *mybutton = new QPushButton(); layoutReal->addWidget(mybutton); widgetReal->setLayout(layoutReal); layoutFake->addWidget(mybutton); //this changes the parent and this is not what I want to do widgetFake->setLayout(layoutFake); mybutton->show();

La razón por la que necesito esto es porque tengo un montón de MDISubWindows y contienen algunos controles (botones, casillas de verificación, etc.). Ahora quiero seleccionar algunos de estos controles de estos widgets y crear un solo widget. La razón por la que hago esto es porque, no quiero mostrar toda mi MDISubwindow cuando estoy usando solo un botón en ella. Cualquier sugerencia es realmente útil. Gracias.

-CV


Se supone que los QWidgets solo tienen un único padre. Sin duda, podrías encontrar algún truco que te permitiera lograr más o menos lo que quieres, pero ¿por qué hacerlo cuando podrías rediseñar para que encajara con la forma en que funciona el sistema Qt GUI?

No intentes luchar contra el marco. Si lo haces, acabarás teniendo un código difícil de entender y difícil de mantener.


En lugar de intentar compartir un botón entre padres múltiples, puede crear QActions e incrustarlos en múltiples QToolButton (con QToolButton :: setDefaultAction) o agregando la acción a un QToolBar.

QAction puede ser seleccionable / seleccionable, y puede agregarse a grupos exclusivos (QActionGroup) para tener el mismo comportamiento que los botones de opción. Todas las propiedades y estados de QToolButtons se mantendrán sincronizados con los de la QAction a la que están vinculados.


De todos modos, diseñé un truco para esto. Lo que trato de hacer es separar la apariencia del objeto real del botón. Aquí hay un código de muestra que debe ampliarse para obtener más funcionalidades

archivo :: VirtualQPushButton.h

#ifndef VIRTUALQPUSHBUTTON_H #define VIRTUALQPUSHBUTTON_H #include <QPushButton> //! /class Class that forwards signals to the base button class VirtualQPushButton : public QPushButton { Q_OBJECT public: VirtualQPushButton (QPushButton &basebutton, QWidget * parent = 0) : QPushButton (parent), m_button (&basebutton) { QObject::connect(this, SIGNAL(clicked()), this, SLOT(forwardClick())); //don''t forget to forward other signals too } protected slots: void forwardClick() { if (m_button) { m_button->click(); } } private: QPushButton *m_button; }; #endif // VIRTUALQPUSHBUTTON_H

archivo :: main.cpp

#include <QtGui/QApplication> #include <QHBoxLayout> #include "VirtualQPushButton.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QWidget w; QPushButton *basebutton = new QPushButton (&w); basebutton->hide(); QObject::connect (basebutton, SIGNAL (clicked()), &w, SLOT (close())); VirtualQPushButton *buton1 = new VirtualQPushButton (*basebutton); buton1->setText("Buton1"); VirtualQPushButton *buton2 = new VirtualQPushButton (*basebutton); buton2->setText("Buton2"); QHBoxLayout *lyt = new QHBoxLayout(); lyt->addWidget(buton1); lyt->addWidget(buton2); w.setLayout(lyt); w.show(); return a.exec(); }

Déjame saber qué opinas, gracias por todas tus respuestas.

CV


Qt no admite lo que quieres hacer, así que citaré la respuesta de stu :

No intentes luchar contra el marco. Si lo haces, acabarás teniendo un código difícil de entender y difícil de mantener.

Aunque un widget no puede estar en varios lugares a la vez, puede hacer que parezca ser así:

void MyWidget::paintEvent(QPaintEvent *e) { QPainter p(this); QWidget *w = getRepeatableWidget(); w->render(this, getPosition1()); w->render(this, getPosition2()); }

Una vez que hayas hecho eso, necesitarás manejar los clics y otros eventos y hacer que parezca que fueron reenviados, etc., pero perderás las pistas de foco y otras cosas a menos que hagas un gran esfuerzo.