Qt C++ - 无法添加插槽

Qt C++ - Can't add slots

本文关键字:添加 插槽 C++ Qt      更新时间:2023-10-16

当我在脚本中添加插槽时,它将不再构建。

inkpuppet.obj:-1: error: LNK2005: "private: void __cdecl InkPuppet::on_aboutButton_clicked(void)" (?on_aboutButton_clicked@InkPuppet@@AEAAXXZ) already defined in main.obj

debugInkPuppet.exe:-1: error: LNK1169: one or more multiply defined symbols found

这是代码:

h-注释掉void on_aboutButton_clicked();,最后的函数将使其运行。

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtCore>
namespace Ui {
class InkPuppet;
}
class InkPuppet : public QWidget
{
    Q_OBJECT

public:
    explicit InkPuppet(QWidget *parent = 0);
    ~InkPuppet();
private:
    Ui::InkPuppet *ui;
private slots:
    void on_aboutButton_clicked();
};
#endif // WIDGET_H

void InkPuppet::on_aboutButton_clicked()
{
}

inkpupt.cpp

#include "inkpuppet.h"
#include "ui_inkpuppet.h"

InkPuppet::InkPuppet(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::InkPuppet)
{
    ui->setupUi(this);
    //connect(ui->lowerFrameBox, SIGNAL(valueChanged(int)), ui->timeSlider, SLOT(setRange(int,int)));
}
InkPuppet::~InkPuppet()
{
    delete ui;
}

main.cpp

#include "inkpuppet.h"
#include "aboutdialog.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    InkPuppet w;
    w.show();
    return a.exec();
}

aboutdialog.h

#ifndef ABOUTDIALOG_H
#define ABOUTDIALOG_H
#include <QDialog>
namespace Ui {
class AboutDialog;
}
class AboutDialog : public QDialog
{
    Q_OBJECT
public:
    explicit AboutDialog(QWidget *parent = 0);
    ~AboutDialog();
private:
    Ui::AboutDialog *ui;
};
#endif // ABOUTDIALOG_H

关于拨号.cpp

#include "aboutdialog.h"
#include "ui_aboutdialog.h"
AboutDialog::AboutDialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::AboutDialog)
{
    ui->setupUi(this);
}
AboutDialog::~AboutDialog()
{
    delete ui;
}

您在inkpuppet.h中定义void InkPuppet::on_aboutButton_clicked(),然后将其包含在inkpuppt.cpp中,并在main.cpp->中找到一个或多个多重定义符号。

放入

void InkPuppet::on_aboutButton_clicked()
{
}

在您的inkpupt.cpp文件中。

如果粘贴的第一个文件是一个整体,则include保护程序有问题。定义为防护端之后。

#endif // WIDGET_H
void InkPuppet::on_aboutButton_clicked()
{
}

您的定义正好在#endif之后,这意味着只要在同一翻译单元中,标头被包含两次,就会出现此错误。这种情况发生在您的代码中,因为inkpuppet.h包含在main.cppinkpuppet.cpp中。您应该将on_aboutButton_clicked()的实现代码放在inkpuppet.cpp文件中。