测试代码
h
#include <QMainWindow>
#include <QDebug>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
public://枚举值测试
enum BtnEnum {
pushButton,
pushButton_2,
pushButton_3,
pushButton_4,
pushButton_5,
pushButton_6,
pushButton_7,
BTN_COUNT //btn就是按钮的缩写,count就是总数
};
Q_ENUM(BtnEnum)
public:
void someFunction();
public slots:
void slot_btn_clicked();
void Print(int btnType);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
注意:如果枚举写在类里面就用Q_ENUM注册一下,如果写在类外面就算了,不用Q_ENUM去注册
cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMetaEnum>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton,&QPushButton::clicked,this,slot_btn_clicked);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::someFunction()
{
//获取BtnEnum这个枚举变量,我们赋值给metaEnum
QMetaEnum metaEnum = QMetaEnum::fromType<MainWindow::BtnEnum>();
// 获取枚举的名称和值
for (int i = 0; i < metaEnum.keyCount(); ++i) {
const char *key = metaEnum.key(i);
int value = metaEnum.value(i);
qDebug() << "Key:" << key << "Value:" << value;//key和value都有了
}
// 根据名称获取枚举值
int btnViewValue = metaEnum.keyToValue("pushButton");//根据pushButton这个名称获取对应的值(索引)
qDebug() << "pushButton value:" << btnViewValue;
// 根据值获取枚举名称
const char *btnStopKey = metaEnum.valueToKey(MainWindow::pushButton_7);//根据枚举值获得名称(这个没啥用啊)
qDebug() << "pushButton_7 key:" << btnStopKey;
}
void MainWindow::slot_btn_clicked()
{
QPushButton *btn = (QPushButton*)sender();//可以在槽函数中使用sender函数,知道是哪个按钮触发了这个槽函数
QString objectName = btn->objectName();//获取这个变量的名称
QMetaEnum metaEnum = QMetaEnum::fromType<MainWindow::BtnEnum>();
int btnType = metaEnum.keyToValue(objectName.toLocal8Bit());
if(btnType>= pushButton && btnType <BTN_COUNT)//BtnEnum 枚举变量的第一枚举值是pushButton,最后一个枚举值是BTN_COUNT
{
Print(btnType);
}
}
void MainWindow::Print(int btnType)
{
QMetaEnum metaEnum = QMetaEnum::fromType<MainWindow::BtnEnum>();
qDebug()<<metaEnum.key(btnType)<<"被调用了";
}
讲解
QMetaEnum metaEnum = QMetaEnum::fromType<MainWindow::BtnEnum>();
可以获取qt中的枚举对象key(i),value(i)
: qt中的枚举对象分别可以使用key和value获取对应的枚举名称和枚举索引