在多个小部件上显示相同的QPushButton

时间:2011-08-12 15:52:40

标签: qt layout copy qobject

我有两个小部件(Real和Fake),其中一个有QPushButton。现在我希望在另一个小部件中显示相同的按钮。我该怎么做?

我不想创建副本,我希望同一个QObject同时显示另一个小部件而不更改父级。

作为一个例子,在下面我想要" mybutton"同时在两个小部件中显示;

  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();

我需要这个的原因是因为我有一堆MDISubWindows并且它们包含一些控件(按钮,复选框等等)。现在我想从这些小部件中选择一些控件并创建一个小部件。这样做的原因是因为,当我只使用单个按钮时,我不想显示我的所有MDISubwindow 任何建议都非常有用。谢谢。

-CV

5 个答案:

答案 0 :(得分:8)

QWidgets应该只有一个父母。毫无疑问,你可以想出一些可以让你大致达到你想要的东西,但是为什么你可以重新设计以适应Qt GUI系统的工作方式呢?

不要试图与框架作斗争。如果你这样做,你最终会得到难以理解和难以维护的代码。

答案 1 :(得分:3)

Qt不支持您要执行的操作,因此我引用stu's response

  

不要试图与框架作斗争。如果你这样做,你最终会得到难以理解和难以维护的代码。

虽然窗口小部件不能同时位于多个位置,但您可以将其显示为:

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

完成后,您需要处理任何点击和其他事件并使其显示为转发等等,但除非您付出很多努力,否则您将失去焦点提示和其他内容

答案 2 :(得分:0)

不要以为你可以;窗口小部件一次只有一个父窗口。您可以使用setParent()移动它,但不要在几个父项中同时显示它。

答案 3 :(得分:0)

您可以创建QActions并将其嵌入多个QToolButton(使用QToolButton :: setDefaultAction)或将操作添加到QToolBar,而不是尝试在多个父项之间共享按钮。

QAction可以是可检查/可切换的,并且可以添加到专用组(QActionGroup)以具有与单选按钮相同的行为。 所有QToolButtons属性和状态将与它们链接到的QAction保持同步。

答案 4 :(得分:0)

无论如何,我设计了一个黑客。我想要做的是将外观与实际的按钮对象分开。以下是需要扩展以获得更多功能的示例代码

file :: 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

file :: 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();
}

请告诉我您的意见,感谢您的所有回复。

CV