3

我有两个小部件(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 任何建议都非常有帮助。谢谢你。

-简历

4

5 回答 5

9

QWidgets 应该只有一个父级。毫无疑问,您可以想出一些技巧来大致实现您想要的,但是当您可以重新设计以适应 Qt GUI 系统的工作方式时,为什么要这样做呢?

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

于 2011-08-12T16:21:41.097 回答
3

Qt 不支持你想做的事情,所以我会引用stu 的回复

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

尽管一个小部件不能同时出现在多个位置,但您可以让它看起来像这样:

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

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

于 2011-08-12T18:17:39.363 回答
0

不要认为你可以;一个小部件一次只有一个父级。您可以使用 setParent() 移动它,但不能同时在多个父母中显示。

于 2011-08-12T16:17:34.637 回答
0

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

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

于 2011-08-16T20:49:50.563 回答
0

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

文件:: 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

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

让我知道您的意见,感谢您的所有回复。

简历

于 2011-12-08T17:44:59.230 回答