简单 Qt 程序中未定义的引用

Amo*_*kar 5 c++ qt undefined

我是一个在 Qt Creator 中制作程序的初学者。我制作了一个应该使用 打开 Google Chrome 的按钮QtProcess::execute(),但出现以下错误:

F:\Users\Amol-2\Desktop\Imp Docs\C++ apps\build-QtMainLProject-Desktop_Qt_5_2_0_MinGW_32bit-Debug\debug\moc_mainwindow.cpp:71: error: undefined reference to `MainWindow::buttonClickHandler()'`
:-1: error:  ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

mainwindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_openChrome_clicked()
{
    QString exeloc = "F:\\Users\\Amol-2\\AppData\\Local\\Google\\Chrome\\Application\\chrome.exe";
    QProcess::execute(exeloc);
}
Run Code Online (Sandbox Code Playgroud)

mainwindow.h:

    namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public slots:
    void buttonClickHandler();


public slots:
    void on_openChrome_clicked();

private:
    Ui::MainWindow *ui;
};
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

hyd*_*yde 6

你的.h文件中有这个:

public slots:
    void buttonClickHandler();
Run Code Online (Sandbox Code Playgroud)

它是一个方法声明,也是一个 Qt 插槽,因此 Qt moc将生成引用它的代码(为连接的信号等调用它)。然后链接器尝试链接该代码以创建您的应用程序二进制文件。但似乎您在任何地方都没有方法定义(实际代码)。

3个可能的修复:

1.

从文件中删除该插槽声明.h,因为您似乎没有使用它。

2.

通过将上面的代码片段更改为文件中的以下内容来添加定义.h

public slots:
    void buttonClickHandler() { /* add code if you want some */ }
Run Code Online (Sandbox Code Playgroud)

这会将声明转换为(内联成员函数的)定义。

3.

或者,将方法定义添加到.cpp文件中,就像其他方法一样:

void MainWindow::buttonClickHandler() {
    // your code here
}
Run Code Online (Sandbox Code Playgroud)