6

Qt3は、QMenuBar::insertItemにQWidget*パラメーターを提供するために使用されます。このようにして、任意のカスタムウィジェット(時計ウィジェットなど)をメニューバーに追加できます。Qt4には、そのようなオーバーロードされたメソッドはありません。メニューバーにカスタムウィジェットを追加するという同じ目標を達成するための最良の方法は何でしょうか?カスタムウィジェットは、メニューバーのレイアウトに統合する必要があります。anyouneは背景を知っていますか、なぜこのinsertItemのオーバーロードがQt4 APIで削除されたのですか?

よろしくお願いします。

4

3 に答える 3

8

メニューバーにQMenuBar::addAction ( QAction * action )任意のものを追加する方法があります。 たとえば、アイコン+テキストだけでなく、関連付けられたのサブクラスである、の場合があります。QAction
QWidgetActionQActionQWidget

于 2010-10-12T14:01:20.633 に答える
4

短いコメントでごめんなさいハビエル。私が一線を画すつもりであるたびに、コメントが提出されました:-(

QtCreatorで作成したプロジェクトでこのコードを試しました。

class MyWidgetAction : public QWidgetAction
{
public:
    MyWidgetAction( QObject * parent ) :QWidgetAction (  parent )
    {

    }
    void releaseWidget ( QWidget * widget )
    {
        widget->deleteLater();
    }

    QWidget * requestWidget ( QWidget * parent )
    {
        QPushButton *b = new QPushButton( tr("MyWidget"), parent );
        b->show();
        return b;
    }
};

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);    
    QAction *a = new QAction(tr("TestAction"),this); //1
    QWidgetAction * wa = new QWidgetAction(this);    //2
    wa->setDefaultWidget(new QPushButton("Default"));
    MyWidgetAction *mwa = new MyWidgetAction(this);  //3

    ui->menuBar->addAction( a ); //1 - works. TestAction added to menu bar
    ui->menuBar->addAction( wa ); //2 - noop. nothing added to menu bar
    ui->menuBar->addAction( mwa ); //3 - noop. nothing added to menu bar
}

QAction(1)の追加のみが機能しました。QWidgetActionをサブクラス化せずにデフォルトウィジェットでQWidgetActionを追加しても、結果は得られませんでした。C-TorとMyWidgetActionの両方の仮想関数にブレークポイントを設定しました。驚いたことに、C-Torのブレークポイントだけがヒットしました。オープンソースのMinGWバージョンのQt4.6.3を使用してWindowsを試しましたが、Qtのバグである可能性がありますか?よろしくお願いします!

よろしく、バレンティンハイニッツ

于 2010-10-12T18:36:39.567 に答える
1

これを行うには、自分のQMenuBarウィジェットとカスタムウィジェットを新しいウィジェットに追加し、それQWidgetをメニューバーとして使用する必要がありました。

MenuWidget::MenuWidget(QWidget *parent, Qt::WFlags flags)
    : QMainWindow(parent, flags)
{
    ui.setupUi(this);

    QWidget *w = new QWidget(this);
    QHBoxLayout *layout = new QHBoxLayout(w);

    layout->addWidget(ui.menuBar);

    QLineEdit *edit = new QLineEdit("", w);
    layout->addWidget(edit);

    layout->addStretch(10);

    setMenuWidget(w);
}

これはWindowsでは機能しますが、Macでは機能しません。

于 2011-01-31T17:22:05.803 に答える