Реализовать функцию для кнопки QT

#c #eclipse #qt

#c #eclipse #qt

Вопрос:

Я не могу найти никакого решения проблемы. Я создал пользовательский интерфейс с помощью qt и хотел реализовать функцию для кнопки. Это сработает, если я удалю кнопки в заголовочном файле.

Ошибка

/usr/bin/ld: CMakeFiles/QT3.dir/QT3_autogen/mocs_compilation.cpp.o: в функции MainWindow::qt_metacall(QMetaObject::Call, int, void**)': mocs_compilation.cpp:(.text 0x10a): undefined reference to MainWindow::on_nextStep_clicked()’ /usr/bin/ld: CMakeFiles/QT3.dir/QT3_autogen/mocs_compilation.cpp.o: в функции MainWindow::qt_static_metacall(QObject*, QMetaObject::Call, int, void**)': mocs_compilation.cpp:(.text 0x41): undefined reference to MainWindow:: on_nextStep_clicked()’

Файл заголовка

 #ifndef MAINWINDOW3_H_
#define MAINWINDOW3_H_

#include <QMainWindow>
#include <opencv2/highgui/highgui.hpp>
#include <QGraphicsScene>

//QT_BEGIN_NAMESPACE
//namespace Ui { class MainWindow; }
//QT_END_NAMESPACE

namespace Ui {
class MainWindow;
}

class MainWindow: public QMainWindow {
    Q_OBJECT

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

    signals:

private slots:

//    void on_pushButton_5_clicked(); // add Wall
//    void on_pushButton_clicked(); // oben
//    void on_pushButton_2_clicked(); // links
//    void on_pushButton_3_clicked(); // rechts
//    void on_pushButton_4_clicked(); // unten

    void on_pushButton_clicked();

    void on_nextStep_clicked();

private:
    Ui::MainWindow *ui;

    QGraphicsScene *scene;
protected:
//    bool eventFilter(QObject *, QEvent *);
};

#endif /* MAINWINDOW3_H_ */
  

Cpp-файл

 #include "mainwindow3.h"
#include "ui_mainwindow.h"

#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsItem>
#include <QDebug>
#include <QMouseEvent>
#include <QObject>

#include <iostream>

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

    scene = new QGraphicsScene(this);
    ui->graphicsView->setScene(scene);

//    ui->graphicsView->installEventFilter(this);
}
MainWindow::~MainWindow() {
    delete ui;
}

void MainWindow::on_pushButton_clicked() {
    std::cout << "add btn clicked()" << std::endl;
}
  

Комментарии:

1. Какую версию Qt вы используете? Часть Qt3 кажется запутанной.

2. его версия 5.12.8. извините за путаницу, но это мой третий тестовый проект qt и другие мои проекты работают нормально.

3. Ваш код показывает, что вы не реализовали on_nextStep_clicked() в своем cpp-файле.

4. Я знаю, что если я реализую on_nextStep_clicked(), это сработает, но это не сработало с кнопками, и я назвал их правильно.

5. Затем вам нужно удалить void on_nextStep_clicked(); из вашего заголовка, поскольку для того, чтобы это было в вашем заголовке в слоте, требуется, чтобы функция была определена в файле .cpp.

Ответ №1:

слот — это просто еще один метод в Qt для событий asyn

если вы определяете в заголовке:

 void on_nextStep_clicked();
  

тогда вам нужна реализация в cpp:

 void MainWindow::on_nextStep_clicked()
{
    qDebug() << "Hallo Welt!";
    qDebug() << "on_nextStep_clicked()";
}