c++ Qt中没有名为'setupUI'的成员

qpgpyjmq  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(217)

我正在设计一个Qt Ui文件来使用它,但在cpp文件中有一个错误调用'no member named ' setupUi '。以前有人处理过这个错误吗?
头文件:

#ifndef SCHEDULERSCAN_H
#define SCHEDULERSCAN_H

#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace SchedulerUi {
   class SchedulerScan;
}
QT_END_NAMESPACE
class SchedulerScan : public QMainWindow
{
   Q_OBJECT

public:
SchedulerScan(QWidget *parent = nullptr);
~SchedulerScan();

private:
   SchedulerScan *ui;
};

#endif // SCHEDULERSCAN_H

Cpp文件:

#include "schedulerscan.h"
#include "ui_schedulerscan.h"

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

SchedulerScan::~SchedulerScan()
{
    delete ui;
}
nlejzf6q

nlejzf6q1#

您的代码有两个名为SchedulerScan的类:您正在编写的类,以及来自ui_schedulerscan.h的自动生成的UI类(自动生成)。但是第二个类位于Ui命名空间中,因此该类的全名是Ui::SchedulerScan。此外,您还向前声明了一个根本不存在的SchedulerUi::SchedulerScan类。
您实际上并没有遵循使用Qt表单的典型习惯用法,但已经很接近了。使用Qt实现这一点的典型方法是在类的Ui命名空间中包含一个指向类的指针,并在构造函数中分配它,然后调用该类的setupUi()
但是在你的例子中,你有一个指向你自己的类的指针,它没有setupUi()方法。即使你添加了这个方法,你也会通过在你自己的类的 * 构造函数 * 中分配你自己的类的对象来创建一个无限循环。
您实际上需要做的是遵循标准的Qt模式,并使Ui名称空间中的类成为成员。
我已经调整了你的头文件,以遵循典型的模式:

#ifndef SCHEDULERSCAN_H
#define SCHEDULERSCAN_H

#include <QMainWindow>
namespace Ui {
   class SchedulerScan;
}
class SchedulerScan : public QMainWindow
{
   Q_OBJECT

public:
SchedulerScan(QWidget *parent = nullptr);
~SchedulerScan();

private:
   Ui::SchedulerScan *ui;
};

#endif // SCHEDULERSCAN_H

你的C++文件:

#include "schedulerscan.h"
#include "ui_schedulerscan.h"

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

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

请注意,我已经将Ui::添加到ui成员的类型声明中,并将类型提供给new操作符。我还将头文件中forward声明的名称空间替换为Ui名称空间,否则类中的指针将无法编译。此外,我已经删除了头文件中的QT_BEGIN_NAMESPACEQT_END_NAMESPACE宏,因为它们被Qt内部用于可选地为Qt类定义命名空间(取决于构建选项)。它们根本不应该被用户使用,除非你正在专门化一个Qt模板。

相关问题