发生背景
自制的MainWindow
类继承QObject
类,其中包含一个私有的QMainWindow
,叫windowWidget
。
由于是has-a
关系,我写了一份inline
槽函数,转发show
槽。
但编译器不允许这么做,并发出莫名其妙的抱怨:
错误信息
warning: inline function 'void dm::ui::MainWindow::show()' used but never defined
| inline void show();
| ^~~~
warning: inline function 'void dm::ui::MainWindow::show()' used but never defined
| inline void show();
| ^~~~
...\moc_mainwindow.cpp: error: undefined reference to `dm::ui::MainWindow::show()'
error: undefined reference to `dm::ui::MainWindow::show()'
error: collect2.exe: error: ld returned 1 exit status
error: ninja: build stopped: subcommand failed.
相关代码
mainwindow.hpp
:
#ifndef DM_UI_MAINWINDOW
#define DM_UI_MAINWINDOW
#include <QtCore/QObject>
#include <QtWidgets/QMainWindow>
namespace dm::ui {
class MainWindow : public QObject {
Q_OBJECT
public slots:
inline void show();
private:
QMainWindow windowWidget;
}
}
#endif
mainwindow.cpp
:
namespace dm::ui {
inline void show() {
windowWidget->show();
}
}
main.cpp
:
#include "mainwindow.hpp"
int main(int argc, char *argv[]) {
QApplication gui(argc, argv);
dm::ui::MainWindow* mainWindow = new dm::ui::MainWindow();
mainWindow->show();
return gui.exec();
}
解决方案
去掉inline
。
+ void show();
- inline void show();
+ void show() {
- inline void show() {
原因
(推测)
如果槽函数是inline
的话,QObject::connect
取不到地址,抛出编译错误。