3

2 つのウィジェット (Real と Fake) があり、そのうちの 1 つに 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 があり、それらにいくつかのコントロール (ボタン、チェックボックスなど) が含まれているためです。ここで、これらのウィジェットからこれらのコントロールのいくつかを選択して、単一のウィジェットを作成したいと考えています。これを行っている理由は、ボタンを 1 つだけ使用しているときに 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

とにかく、私はこれにハックを設計しました。私がやろうとしているのは、実際のボタンオブジェクトから外観を分離することです。これは、より多くの機能のために拡張する必要があるサンプルコードです

ファイル::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 に答える
0

複数の親間でボタンを共有しようとするのではなく、QActions を作成して複数の QToolButton に埋め込む (QToolButton::setDefaultAction を使用) か、アクションを QToolBar に追加することができます。

QAction は、チェック可能/トグル可能であり、排他的なグループ (QActionGroup) に追加して、ラジオ ボタンと同じ動作をさせることができます。QToolButtons のすべてのプロパティと状態は、リンク先の QAction のものと同期されます。

于 2011-08-16T20:49:50.563 に答える
0

できるとは思わないでください。ウィジェットには一度に 1 つの親しかありません。setParent() で移動できますが、複数の親で同時に表示することはできません。

于 2011-08-12T16:17:34.637 に答える