QT——组件提升+读取qss文件

本案例是创建myPtnMenu,功能是点击按钮之后出现类似于菜单栏的弹窗
效果如下:
image

1、新建C++类

这里勾选QObject和Q_OBJECT(宏)
image-20230308183843970

只有加入了Q_OBJECT,才能使用QT中的signal和slot机制,且Q_OBJECT要放在类的最前面

2、修改.h文件

使myPtnMenu继承QPushButton,传递QWidget对象
image-20230308183910349
.cpp文件

#include "myptnmeau.h"
#include <QAction>

myPtnMeau::myPtnMeau(QWidget *parent) : QPushButton(parent)
{
    //  创建菜单
    myMenu = new QMenu(this);
    //  创建action
    QAction *helpAct = new QAction("帮助",this);
    QAction *moreAct = new QAction("更多",this);
    // 向菜单里添加action
    myMenu->addAction(helpAct);
    myMenu->addAction(moreAct);
    // 给按钮设置菜单
    this->setMenu(myMenu);
}

myPtnMeau::~myPtnMeau()
{
    delete myMenu;
}

3、组件提升

image-20230308184028780
点击按钮就会出现效果

4、添加样式

这里为了使效果更明显,使用qss文件的方式添加样式
添加资源前缀qss,添加qss文件【menu.qss】
image-20230308185026447
qss文件内容如下

QMenu{
	background-color:white;
	padding:3px;
	border:1px groove gray;
}
QMenu::item{
	background-color:transparent;
}
QMenu::item:selected{
	background-color:rgba(255,0,0);
}

读取并写入

QFile file(":/qss/qss/menu.qss");
file.open(QIODevice::ReadOnly);
if(file.isOpen())
{
    QString str = file.readAll();
    myMenu->setStyleSheet(str);
    file.close();
}

5、.cpp完整代码

#include "myptnmeau.h"
#include <QAction>
#include <QFile>

myPtnMeau::myPtnMeau(QWidget *parent) : QPushButton(parent)
{
    myMenu = new QMenu("",this);
    QAction *helpAct = new QAction("帮助",this);
    QAction *moreAct = new QAction("更多",this);
    myMenu->addAction(helpAct);
    myMenu->addAction(moreAct);

    QFile file(":/qss/qss/menu.qss");
    file.open(QIODevice::ReadOnly);
    if(file.isOpen())
    {
        QString str = file.readAll();
        myMenu->setStyleSheet(str);
        file.close();
    }

    this->setMenu(myMenu);
}

myPtnMeau::~myPtnMeau()
{
    delete myMenu;
}

image

posted @ 2023-03-08 23:18  摩天仑  阅读(253)  评论(0编辑  收藏  举报