将自定义小部件添加到QMenuBar

Val*_*itz 4 porting qt4 qt3

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

最好的祝福.

Jav*_*ier 8

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


Val*_*itz 5

抱歉哈维尔的简短评论。每次我打算换行时,都会提交评论:-(

我在使用 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
}
Run Code Online (Sandbox Code Playgroud)

仅添加 QAction (1) 有效。使用默认小部件添加 QWidgetAction 和子类化 QWidgetAction 都没有给出结果。我已经在 C-Tor 和 MyWidgetAction 的两个虚拟函数中设置了断点。令人惊讶的是,只击中了 C-Tor 断点。我已经在 Windows 上尝试过使用开源的 MinGW 版本的 Qt4.6.3 这可能是 Qt 中的一个错误吗?预先非常感谢您的任何建议!

问候, 瓦伦丁·海尼茨

  • 您确实应该添加额外的信息作为对原始问题的编辑,但我们边走边学习,对吧?:) 这个解决方案应该可以工作,但是您应该在重写 createWidget() 而不是 requestWidget() 中创建您的小部件。requestWidget() 不是虚拟的。 (2认同)