我正在设计一个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;
}
1条答案
按热度按时间nlejzf6q1#
您的代码有两个名为
SchedulerScan
的类:您正在编写的类,以及来自ui_schedulerscan.h
的自动生成的UI类(自动生成)。但是第二个类位于Ui
命名空间中,因此该类的全名是Ui::SchedulerScan
。此外,您还向前声明了一个根本不存在的SchedulerUi::SchedulerScan
类。您实际上并没有遵循使用Qt表单的典型习惯用法,但已经很接近了。使用Qt实现这一点的典型方法是在类的
Ui
命名空间中包含一个指向类的指针,并在构造函数中分配它,然后调用该类的setupUi()
。但是在你的例子中,你有一个指向你自己的类的指针,它没有
setupUi()
方法。即使你添加了这个方法,你也会通过在你自己的类的 * 构造函数 * 中分配你自己的类的对象来创建一个无限循环。您实际上需要做的是遵循标准的Qt模式,并使
Ui
名称空间中的类成为成员。我已经调整了你的头文件,以遵循典型的模式:
你的C++文件:
请注意,我已经将
Ui::
添加到ui
成员的类型声明中,并将类型提供给new
操作符。我还将头文件中forward声明的名称空间替换为Ui
名称空间,否则类中的指针将无法编译。此外,我已经删除了头文件中的QT_BEGIN_NAMESPACE
和QT_END_NAMESPACE
宏,因为它们被Qt内部用于可选地为Qt类定义命名空间(取决于构建选项)。它们根本不应该被用户使用,除非你正在专门化一个Qt模板。