linux下 qt编程qmenubar控件

在qt下用qmenubar控件继承的是qwidget但是弹出的界面上没有显示,在Linux最外层界面上显示,这是什么原因,恳请大神们指导指导,谢谢

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:linux下用QT捕获程序异常
  • 除此之外, 这篇博客: Qt菜单QMenu和菜单栏QMenuBar基本用法、自定义菜单用法中的 2.2代码示例 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    分别添加两个类QMyMenu和QMyWidgetAction,其中QMyMenu继承QMenu,QMyWidgetAction继承QWidgetAction。

    qmywidgetaction.h

    #ifndef QMYWIDGETACTION_H
    #define QMYWIDGETACTION_H
    
    #include <QWidgetAction>
    
    class QMyWidgetAction : public QWidgetAction
    {    
    public:
        explicit QMyWidgetAction(QWidget *parent=0);
    
    protected:
        virtual QWidget *createWidget(QWidget *parent);
    };
    
    #endif // QMYWIDGETACTION_H
    

     

    qmywidgetaction.cpp

    #include "qmywidgetaction.h"
    #include <QPushButton>
    #include <QSplitter>
    #include <QLabel>
    #include <QLineEdit>
    #include <QPixmap>
    #include <QMouseEvent>
    #include <QHBoxLayout>
    #include <QDebug>
    
    QMyWidgetAction::QMyWidgetAction(QWidget *parent):QWidgetAction(parent)
    {
    }
    
    QWidget *QMyWidgetAction::createWidget(QWidget *parent)
    {
        QLabel* lab = new QLabel("label1");
        QPushButton *button1=new QPushButton("button1");
        QHBoxLayout *hlayout=new QHBoxLayout;
        hlayout->setMargin(0);
        hlayout->setSpacing(0);
        hlayout->addWidget(lab);
        hlayout->addWidget(button1);
        QWidget* widget = new QWidget(parent); //如果写成 QSplitter* sp = new QSplitter;  就无法显示!!!
        widget->setLayout(hlayout);
        connect(button1,&QPushButton::clicked,[this](bool){qDebug()<<"单击按钮!";});
        return widget;
    }
    

     

    qmymenu.h

    #ifndef QMYMENU_H
    #define QMYMENU_H
    
    #include <QMenu>
    #include <QMouseEvent>
    
    class QMyMenu : public QMenu
    {
    public:
        explicit QMyMenu(const QString &title, QWidget *parent = Q_NULLPTR);
    
    protected:
    };
    
    #endif // QMYMENU_H
    

     

    qmymenu.cpp

    #include "qmymenu.h"
    #include <QAction>
    
    QMyMenu::QMyMenu(const QString &title, QWidget *parent):QMenu(title,parent) //初始化子类构造函数
    {
    
    }
    

     

    在按钮槽函数调用如下代码即可

    #include "qmywidgetaction.h"
    #include "qmymenu.h"
    #include <QAction>
    #include <QMenuBar>
    #include <QVBoxLayout>
    
    void Widget::on_pushButton_3_clicked()
    {
        QMyMenu *menu= new QMyMenu("菜单:继承QWidgetAction用法");
        QAction *action1=new QAction(QIcon(":/resource/image/向右箭头.jpg"),"1");   //设置图标和内容
        menu->addAction(action1);
        QMyWidgetAction *myWidgetAction=new QMyWidgetAction(menu);
        menu->addSeparator();   //添加分割线
        menu->addAction(myWidgetAction);
        QMenuBar *menuBar=new QMenuBar(this);
        menuBar->setStyleSheet("QMenuBar{background-color:red}"
                               "QMenuBar:hover{background-color:blue}");
        menuBar->addMenu(menu);
        ui->verticalLayout->addWidget(menuBar);
        ui->verticalLayout->addStretch();
    }

    结果如下图所示

     


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^