Qt4 向QMenuBar添加自定义小部件

Qt4 向QMenuBar添加自定义小部件,qt4,porting,qt3,Qt4,Porting,Qt3,Qt3用于为QMenuBar::insertItem提供QWidget*参数。这样,任何自定义小部件都可以添加到菜单栏中,例如时钟小部件。 在Qt4中没有这样的重载方法。达到相同目标的最佳方法是什么?向菜单栏添加自定义小部件?自定义小部件应集成在菜单栏的布局中。 有人知道背景吗,为什么在QT4API中删除了这个insertItem重载 致以最诚挚的问候。有一个QMenuBar::addAction(QAction*action)方法,可以向菜单栏添加任意QAction。 例如,它可能是一个QWi

Qt3用于为QMenuBar::insertItem提供QWidget*参数。这样,任何自定义小部件都可以添加到菜单栏中,例如时钟小部件。 在Qt4中没有这样的重载方法。达到相同目标的最佳方法是什么?向菜单栏添加自定义小部件?自定义小部件应集成在菜单栏的布局中。 有人知道背景吗,为什么在QT4API中删除了这个insertItem重载


致以最诚挚的问候。

有一个
QMenuBar::addAction(QAction*action)
方法,可以向菜单栏添加任意
QAction


例如,它可能是一个
QWidgetAction
,它是
QAction
的一个子类,带有一个关联的
QWidget
,而不仅仅是一个图标+文本。

很抱歉Javier发表了简短的评论。每次我打算打断一行,都会有人提交评论:-(

我在使用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断点。 我已经在Windows上试用了Qt4.6.3的开源MinGW版本 这可能是Qt中的一个bug吗? 提前非常感谢您的建议

问候,,
Valentin Heinitz

我只能通过将我的
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电脑上不起作用。

您确实应该在原始问题中添加额外信息作为编辑,但我们边做边学?:)此解决方案应该可行,但您应该在createWidget()而不是requestWidget()的覆盖中创建小部件。requestWidget()不是虚拟的。谢谢!不幸的是,它对MenuBar仍然不起作用。QMenuBar只是不想接受自定义小部件:-(但是,它适用于子菜单,例如ui->menuFile->addAction(mwa);有效。我的自定义按钮出现在“文件”菜单中。@ValentinHeinitz你有没有想过解决这个问题的方法?你能在
QMenuBar
中添加一个小部件吗?@SteveLorimer这是很久以前的事了。不,对于那个项目,我终于把主菜单作为一个小部件实现了。是的,我也这样做了!:(好的,现在我知道了。这是一个错误,addAction是QWidgets的方法,并且没有对QMenuBar做任何特殊的操作。没有指定将QWidgetAction添加到QMenuBar。操作被添加,但小部件被忽略。但是QMenu重载addAction,并将QWidgets显示为菜单项。我很惊讶,我必须实现我的菜单栏并将其添加到QMenuBar中。)o使用setMenuBarWidget的应用程序。感谢您为MAC提供信息,很有趣!