2010-10-12 136 views
4

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

此致敬礼。

回答

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用。我已经在C-Tor和MyWidgetAction的两个虚拟函数中设置了断点,令人惊讶的是,只有C-Tor断点被打了出来 我在Windows上用Open-Source,MinGW Qt4.6.3的版本 难道是Qt中的一个bug? 非常感谢您提前给出任何建议!

问候, 瓦伦丁Heinitz

+2

你真的应该添加额外的信息作为你的原始问题的编辑,但我们学习,当我们去对吗? :)此解决方案应该可以工作,但是您应该在createWidget()而不是requestWidget()的重写中创建您的小部件。 requestWidget()不是虚拟的。 – 2010-10-12 21:49:19

+0

谢谢!不幸的是它仍然不适用于MenuBar。 QMenuBar根本不想接受自定义小部件:-(然而,它适用于子菜单,例如ui-> menuFile-> addAction(mwa);作品。我的自定义按钮出现在文件菜单中。 – 2010-10-13 13:23:28

+0

@ValentinHeinitz做过你了有没有想过一个解决这个问题的方法?你能够在QMenuBar中添加一个小部件吗? – 2016-01-20 18:33:28

8

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

+0

非常感谢您的回答,哈维尔。 – 2010-10-12 18:20:30

+0

不幸的是它不起作用:-) – 2010-10-12 18:23:51

+1

好吧,现在我已经得到它了。这是一个错误,addAction是QWidgets的方法,并没有特别用QMenuBar做任何事情。未指定将QWidgetAction添加到QMenuBar。该操作已添加,但小部件将被忽略。然而,QMenu重载addAction,并将QWidgets显示为菜单项。我很害怕,我必须实现我的菜单栏并使用setMenuBarWidget将它添加到应用程序中。 – 2010-10-20 14:31:25

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上不起作用。

+0

谢谢你提供MAC的信息,有趣! – 2011-04-18 09:24:38

相关问题