Qt3用于提供带有QWidget *参数的QMenuBar :: insertItem。这样任何自定义小部件都可以添加到菜单栏 - 例如时钟小部件。 在Qt4中没有这样的重载方法。达到相同目标的最佳方式是什么 - 将自定义小部件添加到菜单栏?自定义小部件应该集成在菜单栏的布局中。 Anyoune是否知道背景,为什么在Qt4 API中删除了insertItem的重载?向QMenuBar添加自定义小部件
此致敬礼。
Qt3用于提供带有QWidget *参数的QMenuBar :: insertItem。这样任何自定义小部件都可以添加到菜单栏 - 例如时钟小部件。 在Qt4中没有这样的重载方法。达到相同目标的最佳方式是什么 - 将自定义小部件添加到菜单栏?自定义小部件应该集成在菜单栏的布局中。 Anyoune是否知道背景,为什么在Qt4 API中删除了insertItem的重载?向QMenuBar添加自定义小部件
此致敬礼。
对不起哈维尔的简短评论。每次我打算断行,有人评论:-(
提交我试图与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
有一个QMenuBar::addAction (QAction * action)
方法,将任意QAction
添加到菜单栏。
例如,它可以是QWidgetAction
,它是QAction
的子类,具有关联的QWidget
而不是仅图标+文本。
非常感谢您的回答,哈维尔。 – 2010-10-12 18:20:30
不幸的是它不起作用:-) – 2010-10-12 18:23:51
好吧,现在我已经得到它了。这是一个错误,addAction是QWidgets的方法,并没有特别用QMenuBar做任何事情。未指定将QWidgetAction添加到QMenuBar。该操作已添加,但小部件将被忽略。然而,QMenu重载addAction,并将QWidgets显示为菜单项。我很害怕,我必须实现我的菜单栏并使用setMenuBarWidget将它添加到应用程序中。 – 2010-10-20 14:31:25
我只能通过增加我的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上不起作用。
谢谢你提供MAC的信息,有趣! – 2011-04-18 09:24:38
你真的应该添加额外的信息作为你的原始问题的编辑,但我们学习,当我们去对吗? :)此解决方案应该可以工作,但是您应该在createWidget()而不是requestWidget()的重写中创建您的小部件。 requestWidget()不是虚拟的。 – 2010-10-12 21:49:19
谢谢!不幸的是它仍然不适用于MenuBar。 QMenuBar根本不想接受自定义小部件:-(然而,它适用于子菜单,例如ui-> menuFile-> addAction(mwa);作品。我的自定义按钮出现在文件菜单中。 – 2010-10-13 13:23:28
@ValentinHeinitz做过你了有没有想过一个解决这个问题的方法?你能够在QMenuBar中添加一个小部件吗? – 2016-01-20 18:33:28