Qt3 用于为 QMenuBar::insertItem 提供 QWidget* 参数。这样,任何自定义小部件都可以添加到菜单栏 - 例如时钟小部件。在 Qt4 中没有这样的重载方法。达到相同目标的最佳方法是什么 - 将自定义小部件添加到菜单栏?自定义小部件应集成在菜单栏的布局中。有谁知道背景,为什么在 Qt4 API 中删除了 insertItem 的这种重载?
此致。
有一种QMenuBar::addAction ( QAction * action )
方法,可以将任意添加QAction
到菜单栏。
例如,它可以是 a QWidgetAction
,它是QAction
具有关联的子类,QWidget
而不仅仅是图标 + 文本。
抱歉哈维尔的简短评论。每次我打算换行时,都会提交评论:-(
我在使用 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 上使用开源、MinGW 版本的 Qt4.6.3 尝试过这可能是 Qt 中的错误吗?非常感谢您的任何建议!
问候, 瓦伦丁·海尼茨
我只能通过将我的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。