我有两个小部件(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
答案 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