繁体   English   中英

使用Qt Creator表单正确进行子类化?

[英]Proper subclassing with Qt Creator forms?

我正在尝试创建一个类(AgilentSweeper),该类是QDockWidget的子类,以便可以在Qt Creator的表单设计器中为其设计布局。 该类的标题如下所示:

// agilentsweeper.h
#ifndef AGILENTSWEEPER_H
#define AGILENTSWEEPER_H

#include <QDockWidget>

namespace Ui {
class AgilentSweeper;
}

class AgilentSweeper : public QDockWidget
{
    Q_OBJECT

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

private:
    Ui::AgilentSweeper *ui;
};

#endif // AGILENTSWEEPER_H

源看起来像

// agilentsweeper.cpp
#include "agilentsweeper.h"
#include "ui_agilentsweeper.h"
#include <QDockWidget>

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

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

在我的主类h文件中,我声明了带有以下内容的AgilentSweeper实例:

#ifndef UTILSWEEP_H
#define UTILSWEEP_H

#include <QMainWindow>
#include <QDockWidget>
#include "agilentsweeper.h"

namespace Ui {
class UtilSweep;
}

class UtilSweep : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::UtilSweep *ui;
    AgilentSweeper sweeper;
};

#endif // UTILSWEEP_H

在主类的构造函数中,我尝试在主窗口的侧面显示“ sweeper”

#include "utilsweep.h"
#include "ui_utilsweep.h"
#include "agilentsweeper.h"
#include <QDockWidget>
#include <QMainWindow>

UtilSweep::UtilSweep(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::UtilSweep)
{
    ui->setupUi(this);
    addDockWidget(Qt::LeftDockWidgetArea,sweeper);
}

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

但是,我得到一个错误

In constructor 'UtilSweep::UtilSweep(QWidget*)':  utilsweep.cpp:12: error: no matching function for call to 'UtilSweep::addDockWidget(Qt::DockWidgetArea, AgilentSweeper&)'
 addDockWidget(Qt::LeftDockWidgetArea,sweeper);

暗示着

candidates are:  void QMainWindow::addDockWidget(Qt::DockWidgetArea, QDockWidget*)
 void addDockWidget(Qt::DockWidgetArea area, QDockWidget *dockwidget);

环顾四周,我发现其他一些人也有类似的错误,但是在他们的情况下,似乎有些地方未包括QDockWidget,或者他们没有使用Q_OBJECT。 这是怎么了

addDockWidget()需要指向QDockWidget对象的指针作为第二个参数。 你的类变量sweeper是对象本身,而不是一个指针。 您对addDockWidget()调用应为:

addDockWidget(Qt::LeftDockWidgetArea, &sweeper);

您应该将清除程序更改为指针,并为它分配new

class UtilSweep : public QMainWindow
{
    ...
    AgilentSweeper *sweeper;
};

UtilSweep::UtilSweep(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::UtilSweep),
    sweeper(new AgilentSweeper(this))
{
    ui->setupUi(this);
    addDockWidget(Qt::LeftDockWidgetArea, sweeper);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM