首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接子和父级之间的信号和插槽(无效使用不完整类型)

连接子和父级之间的信号和插槽(无效使用不完整类型)
EN

Stack Overflow用户
提问于 2017-06-22 17:12:32
回答 2查看 3.2K关注 0票数 4

我正在尝试将子窗口(QDialog名为VolumePage)的信号连接到其父窗口(QMainWindow名为MockUI)。我遇到了一个:

无效使用不完整类型'class Ui::VolumePage‘

当我试图建立连接时出错。

当我创建卷页时,我正在试图连接到MockUI.cpp内部。(按下按钮时发生)

代码语言:javascript
复制
 void MockUI::on_pushButton_3_clicked()
 {
 //Non-Modal Approach

 volPage = new VolumePage(this); 
 volPage->show();
 connect(volPage->ui->verticalSlider,SIGNAL(valueChanged(int)),ui->progressBar,SLOT(setValue(int)));
 }

我把Ui::VolumePage *ui;公之于众。

以下是整个错误:

错误:无效使用不完全类型‘Ui::VolumePage’连接(volPage->ui->verticalSlider,信号(valueChanged(Int)),ui->进度条,槽(setValue(Int);

有人能帮我理解问题是什么吗,或者用另一种干净的方式来做我想做的事?

编辑:(附加来源)

VolumePage.h:

代码语言:javascript
复制
#ifndef VOLUMEPAGE_H
#define VOLUMEPAGE_H

#include <QDialog>

namespace Ui {
class VolumePage;
}

class VolumePage : public QDialog
{
    Q_OBJECT

public:
    explicit VolumePage(QWidget *parent = 0);
    Ui::VolumePage *ui;
    ~VolumePage();

private slots:
    void on_verticalSlider_valueChanged(int value);

private:

};

#endif // VOLUMEPAGE_H

mockUI.cpp:

代码语言:javascript
复制
#include "mockUI.h"
#include "ui_mock_ics.h"
#include <QLCDNumber>
#include "volumepage.h"

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

}

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


void MockUI::on_pushButton_3_clicked()
{
    //Modal Approach
    //VolumePage volPage;
    //volPage.setModal(true);
    //volPage.exec();

    //Non-Modal Approach
    volPage = new VolumePage(this);    
    volPage->show();
    connect(volPage->ui->verticalSlider,SIGNAL(valueChanged(int)),ui->progressBar,SLOT(setValue(int)));

}

volumepage.cpp:

代码语言:javascript
复制
#include "volumepage.h"
#include "mockUI.h"
#include "ui_volumepage.h"

VolumePage::VolumePage(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::VolumePage)
{
    ui->setupUi(this);
    setWindowFlags(Qt::FramelessWindowHint | Qt::Popup);
    //Mock_ICS* ics = (Mock_ICS*)parent;
    //connect(ui->verticalSlider,SIGNAL(valueChanged(int)),ics->ui->progressBar,SLOT(setValue(int)));
    //connect(ui->verticalSlider,SIGNAL(valueChanged(int)),this->parent()->progressBar,SLOT(setValue(int)));


}

VolumePage::~VolumePage()
{
    delete ui;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-23 06:55:59

Ui::VolumePage *ui应该保持隐私。相反,在volPage上创建一个信号,类似于verticalSliderValueChanged(int value)。见下文..。

mockui.h

代码语言:javascript
复制
#ifndef MOCKUI_H
#define MOCKUI_H

#include <QMainWindow>
#include "volumepage.h"

namespace Ui {
class MockUI;
}

class MockUI : public QMainWindow
{
    Q_OBJECT

public:
    explicit MockUI(QWidget *parent = 0);
    ~MockUI();
    VolumePage* volPage;

private slots:
    void on_pushButton_3_clicked();

private:
    Ui::MockUI *ui;
};

#endif // MOCKUI_H

mockui.cpp

代码语言:javascript
复制
#include "mockui.h"
#include "ui_mockui.h"
#include "volumepage.h"

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

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


void MockUI::on_pushButton_3_clicked()
{
    //Non-Modal Approach
    volPage = new VolumePage(this);
    volPage->show();
    connect(volPage,SIGNAL(verticalSliderValueChanged(int)),ui->progressBar,SLOT(setValue(int)));

}

volumepage.h

代码语言:javascript
复制
#ifndef VOLUMEPAGE_H
#define VOLUMEPAGE_H

#include <QDialog>

namespace Ui {
class VolumePage;
}

class VolumePage : public QDialog
{
    Q_OBJECT

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

signals:
    void verticalSliderValueChanged(int value);

private slots:
    void on_verticalSlider_valueChanged(int value);

private:
    Ui::VolumePage *ui;
};

#endif // VOLUMEPAGE_H

volumepage.cpp

代码语言:javascript
复制
#include "volumepage.h"
#include "ui_volumepage.h"

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

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

void VolumePage::on_verticalSlider_valueChanged(int value)
{
    emit verticalSliderValueChanged(value);
}
票数 0
EN

Stack Overflow用户

发布于 2017-06-22 17:15:50

这是pImpl成语在C++中的一个例子。类VolumePage是您应该使用的类--这是generated生成的“公共”接口。Ui::VolumePage包含了您不必担心的复杂细节。

因此,在您的代码中,您应该使用VolumePage,而不是Ui::VolumePage。你不应该让Ui::VolumePage公开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44705619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档