将自定义小部件添加到QMenuBar

时间:2010-10-12 13:41:58

标签: qt4 porting qt3

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

最好的问候。

3 个答案:

答案 0 :(得分:8)

有一个QMenuBar::addAction ( QAction * action )方法,可以在菜单栏中添加任意QAction 例如,它可以是QWidgetAction,它是QAction的子类,带有关联的QWidget,而不仅仅是图标+文字。

答案 1 :(得分:3)

对不起哈维尔的简短评论。每当我想打破一条线时,评论就会提交: - (

我在使用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断点被击中。 我尝试过使用Open-Source,MinGW版Qt4.6.3的Windows 它可能是Qt中的一个错误吗? 非常感谢您提出任何建议!

此致 Valentin Heinitz

答案 2 :(得分:1)

我只能通过将QMenuBar和自定义窗口小部件添加到新QWidget并使用THAT作为菜单栏来实现此目的:

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上运行。