使用多重继承时(分别继承UI类和QtWidget),当加入宏定义Q_OBJECT
时,编译将报错:
tmp/moc_GUI.cpp:174:21: error: ‘staticMetaObject’ is not a member of ‘Ui_MainWindow’
174 | &Ui_MainWindow::staticMetaObject,
| ^~~~~~~~~~~~~~~~
tmp/moc_GUI.cpp: In member function ‘virtual void* GUI::qt_metacast(const char*)’:
tmp/moc_GUI.cpp:195:27: error: ‘qt_metacast’ is not a member of ‘Ui_MainWindow’
195 | return Ui_MainWindow::qt_metacast(_clname);
| ^~~~~~~~~~~
tmp/moc_GUI.cpp: In member function ‘virtual int GUI::qt_metacall(QMetaObject::Call, int, void**)’:
tmp/moc_GUI.cpp:200:26: error: ‘qt_metacall’ is not a member of ‘Ui_MainWindow’
200 | _id = Ui_MainWindow::qt_metacall(_c, _id, _a);
| ^~~~~~~~~~~
make: *** [Makefile:389: tmp/moc_GUI.o] Error 1
源代码如下:
class GUI : public Ui_MainWindow, public QWidget
{
Q_OBJECT
public:
GUI() // 构造函数
{
}
void Clicked_Button();
void Signal_Binding();
~GUI() {} // 析构函数
bool pause = true;
Terminal *term = new Terminal();
};
经过查询得知官方回复:This is actually a known limitation which has been documented for some time, when using multiple inheritance you have to specify the QObject based class first and then the other class.
修改源代码为:
class GUI : public QWidget, public Ui_MainWindow
{
Q_OBJECT
public:
GUI() // 构造函数
{
}
void Clicked_Button();
void Signal_Binding();
~GUI() {} // 析构函数
bool pause = true;
Terminal *term = new Terminal();
};
编译通过。