moc & rcc & uic QT uic rcc moc 命令行使用
cd %PROJ_PATH%
# 资源文件生成
rcc.exe --name mainwindow .\mainwindow.qrc -o .\GeneratedFiles\qrc_mainwindow.cpp
# 界面代码生成
uic.exe .\mainwindow.ui -o .\GeneratedFiles\ui_mainwindow.h
# 信号槽
moc.exe -I.\ .\mainwindow.h -o .\GeneratedFiles\Debug\moc_mainwindow.cpp
需要 c++17,QT 文件路径转 windows 实际文件路径:
#include <filesystem>
QFileInfo fileInfo(defaultFile);
QString tmp = fileInfo.absoluteFilePath();
tmp = tmp.replace("/", "\\");
std::wstring path = tmp.toStdWString();
defaultFile = QString::fromStdWString(std::filesystem::canonical(path));
对于每一个 QObject 类的派生类,qt 都会使用 moc 命令之生成附加的 moc_xxx.cpp 文件。from 在 moc_xxx.cpp 文件中,包含了 QObject 派生类的附加信息。
在 sender.h 头文件中定义一个 Sender 的类:
它分别有三个信号与四个槽函数。
在生成的 moc_sender.cpp 中:
qt_meta_stringdata_Sender 是一个字面量表,也是可称之为符号表。
它的存在是为了能够以 idx 就能获取对应的字符串。比如 idx = 4,对应的字串在则为 (const char *)(qt_meta_stringdata_Sender.stringdata0+29)
另一个则是 qt_meta_data_Sender ,其生成的内容如下:
从上可以看出,通过上面的这个数据,足于描述 Sender 类中有几个信号与槽函数,并描述了它们的参数与返回值类型。 值得注意的是:标识信号与槽的方式都是字符串。因此为引发个别问题: Qt signal 函数使用类内部类型作为参数导致 connect 不成功问题分析 这也是 Qt 反射机制的基础。
定义信号槽:
class Test : public QObject {
Q_OBJECT
public:
explicit Test(QObject* parent = nullptr) : QObject(parent) {
}
signals:
void signalfunc(const MyString& str, int tid);
public slots:
void slotfunc(const MyString& str, int tid);
};
// 生成的信号函数
// SIGNAL 0
void Test::signalfunc(const MyString & _t1, int _t2)
{
void *_a[] = { nullptr, const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t1))), const_cast<void*>(reinterpret_cast<const void*>(std::addressof(_t2))) };
// 这个会调用对象的拷贝构造函数,然后再把指针传过去。
QMetaObject::activate(this, &staticMetaObject, 0, _a);
}