Qt Widgets应用中QRegularExpression等全局可用变量/对象该在哪里定义?
问题原因
你在头文件类定义里用小括号初始化QRegularExpression报错,是C++语法规则限制:类内默认成员初始化仅支持拷贝赋值形式或者花括号列表初始化形式,不支持小括号构造调用。你写的int exampleint = 1这类属于拷贝赋值形式,所以可以正常运行,QRegularExpression re("xxx")用了小括号构造,所以不符合语法要求。
不同作用域的解决方案
1. 仅需要在主窗口类的所有方法/槽中使用
两种写法二选一即可:
- 直接修改类内初始化语法,把小括号换成花括号:
// mainwindowname.h 类的private区域内 QRegularExpression re{"things", QRegularExpression::CaseInsensitiveOption};
- 头文件仅声明变量,在主窗口构造函数中完成初始化:
// mainwindowname.h private: QRegularExpression re; // mainwindowname.cpp 主窗口构造函数 mainwindowname::mainwindowname(QWidget *parent) : QMainWindow(parent), re("things", QRegularExpression::CaseInsensitiveOption) { // 其他构造逻辑 }
2. 需要全应用所有类都能调用这些正则
更规范的做法是封装独立的工具类,统一管理所有正则和文本处理逻辑,示例如下:
// 公共头文件 textutils.h #ifndef TEXTUTILS_H #define TEXTUTILS_H #include <QRegularExpression> class TextUtils { public: // 每个常用正则对应一个静态方法,用到时才会初始化 static const QRegularExpression& thingsRegex() { static const QRegularExpression re("things", QRegularExpression::CaseInsensitiveOption); return re; } // 后续新增正则直接加对应静态方法即可 static const QRegularExpression& otherRegex() { static const QRegularExpression re("other rule"); return re; } }; #endif // TEXTUTILS_H
使用时只需要引入头文件,直接调用TextUtils::thingsRegex()即可拿到正则对象,无需额外初始化。
关于需要特定流程初始化的变量说明
如果你有需要在foo、bar等特定函数执行完成后才能初始化的变量(比如动态长度数组),可以在类内先仅声明变量,再把初始化逻辑放到对应时机的函数中:
- 只要是类的成员变量,不管在类的哪个成员函数中初始化,作用域都是整个类的生命周期,不会局限在初始化函数里,只有函数内定义的局部变量才会在函数执行结束后销毁。
- 如果你需要在窗口显示完成后才执行初始化,可以重写主窗口的
showEvent方法,在方法内完成初始化逻辑即可。
内容的提问来源于stack exchange,提问作者ggtk123
相关产品推荐
相关产品推荐

