2011-08-12 19 views
3

我有两个小部件(Real和Fake),其中一个小部件有一个QPushButton。现在我想要在其他小部件中显示相同的按钮。我该怎么做?在多个小部件上显示相同的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

+1

为什么你需要这个?你想达到什么目的? –

+0

我编辑了回答您的评论的问题 – blueskin

回答

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 

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

+0

如果我想要两个由Qt Designer创建和推广的按钮,我该怎么做?如果我使用静态实例,则会出现错误,因为小部件期望应用程序在之前运行。我没有机会在推广中使用构造函数。 –

0

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

+0

我可能最终只是这样做了,但即使在这种情况下,它也可能会让我的代码变得混乱,因为有时我会评估孩子并使用SignalMapper进行连接。 – blueskin

8

QWidgets应该只有一个父亲。毫无疑问,你可能会想出一些可以让你实现你想要的东西的黑客攻击,但为什么当你可以重新设计以适应Qt GUI系统的工作方式?

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

+0

我明白这一点。但是如果我们从不同的角度来看按钮元素的设计,不应该将“按钮对象”与它的外观分开,即有一个按钮对象可能出现在许多地方。 – blueskin

3

Qt不支持你想要做什么,所以我会引用stu's response

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

虽然小部件不能同时存在于多个地方,你可以把它似乎是这样:

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

一旦你做到了这一点,你需要处理的任何点击和其他事件并使其看起来像是被转发等等,但除非您付出很大努力,否则您将失去焦点提示和其他内容。

0

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

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

+0

好吧,现在这是一个解决方法,只适用于某些特定情况。如果我想要一个完整的重复部件(但不是副本),那么这将无法工作。我的意思是,我们可以破解它,但那会破坏大部分规则,并使代码更难理解:D – blueskin

相关问题