Отображение одного и того же QPushButton на нескольких виджетах - PullRequest
3 голосов
/ 12 августа 2011

У меня есть два виджета (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 ]

8 голосов
/ 12 августа 2011

QWidgets должен иметь только одного родителя.Без сомнения, вы можете придумать какой-нибудь хак, который позволит вам достичь примерно того, чего вы хотите, но зачем это делать, если вы можете изменить дизайн, чтобы он соответствовал принципам работы системы Qt GUI?попытаться бороться с рамками.Если вы это сделаете, вы просто получите трудный для понимания и сложный в обслуживании код.

3 голосов
/ 12 августа 2011

Qt не поддерживает то, что вы хотите сделать, поэтому я процитирую ответ сту :

Не пытайтесь бороться с рамками. Если вы это сделаете, вы просто получите трудный для понимания и сложный в обслуживании код.

Хотя виджет не может быть в нескольких местах одновременно, вы можете сделать так, чтобы он выглядел так:

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

Как только вы это сделаете, вам нужно будет обрабатывать любые клики и другие события и показывать, что они были перенаправлены и т. Д., Но вы потеряете подсказки фокуса и другие вещи, если не приложите много усилий. .

0 голосов
/ 08 декабря 2011

Во всяком случае, я разработал взломать это. То, что я пытаюсь сделать, это отделить внешний вид от фактического объекта кнопки. Вот пример кода, который необходимо расширить для большей функциональности

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

0 голосов
/ 17 августа 2011

Вместо того, чтобы пытаться разделить кнопку между несколькими родителями, вы можете создать QActions и встроить их в несколько QToolButton (с помощью QToolButton :: setDefaultAction) или добавить действие в QToolBar.

QAction может быть отмечаемым / переключаемым и может быть добавлен в исключительные группы (QActionGroup), чтобы иметь то же поведение, что и переключатели. Все свойства и состояния QToolButtons будут синхронизироваться со свойствами QAction, с которыми они связаны.

0 голосов
/ 12 августа 2011

Не думай, что сможешь; виджет имеет только одного родителя за раз. Вы можете переместить его с помощью setParent (), но не показывать его одновременно у нескольких родителей.

...