QProgressBar连接类之间的进度 - “没有匹配的调用函数”

时间:2017-09-04 11:51:49

标签: c++ qt signals-slots qprogressbar

我在一个类中进行正确的信号和插槽设置有一些麻烦,我在其中进行一些计算,另一个类包含带有我的进度条的GUI。我对qt的经验很少,所以我不太清楚信号/插槽是如何工作的。我尝试了很少的手册和教程,但我仍然不知道如何设置它。

让我们调用进度条类mainwindow

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow: public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow*ui;
};

#endif // LOADING_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "calc.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->progressBar->setValue(0);
    calc sender;
    connect(&sender, SIGNAL( inprogress(int) ), ui->progressBar, SLOT( setValue(int) ) );
}


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

void MainWindow::on_pushButton_clicked()
{
    calc clc;
    clc.doData();
}

从计算类发出信号,称之为calc

calc.h

#ifndef CALC_H
#define CALC_H

#include <QObject>

class calc : public QObject
{
Q_OBJECT
public:
    calc(QObject *parent=0);
    void doData();
    void printResults(int t);
signals:
    void inprogress(int progr);

};

#endif // CALC_H

calc.cpp

#include "calc.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

int t = 0;
int t_end = 100;
int progr = 0;

void calc::printResults(int t)
{
    progr = t;
    emit inprogress(progr);
    QCoreApplication::processEvents(); //Prevent GUI freeze.
}

void calc::doData()
{
    for ( int i = 1; i <= t_end; i++ )
    {
        t++;
        printResults(t);
        qDebug()<<t;
    }
}

calc::calc(QObject *parent)
{

}
  

Archiev部分(编辑上面的代码)   编译以此错误结束:   没有匹配函数来调用'loading :: connect(calc *,const char *,   QProgressBar *&amp;,const char *)   我是否以正确的方式使用信号,或者我误解了这个概念?在此计算过程中更新进度条值的&gt;正确方法是什么?

编辑:编辑的代码更清晰,现在显示当前问题 - 信号有效但对qprogressbar没有影响。

EDIT2:现在有效 - 函数必须调用sender->doData()。另外正确的分配是sender = new calc(this)(将calc *sender添加到mainwidnow.h的私有部分)。非常感谢大家的帮助,特别是@eyllanesc以正确的方式!

2 个答案:

答案 0 :(得分:0)

只有从QObject继承的类才能有信号,此外它们必须具有宏Q_OBJECT,因为这通过MOC为信号和插槽之间的连接创建了所有必需的元类。在你的情况下:

<强> *的.h

class calc: public QObject
{
Q_OBJECT
    public:
        calc(QObject *parent=0);
        void signalProgress();
    signals:
        void inprogress();

};

<强> *。CPP

[...]

calc::calc(QObject *parent): QObject(parent)
{

}

还要通过指针创建一个calc实例,因为垃圾收集器会在您使用构造函数后删除该数据。

<强> *的.h

private:
    Ui::loading *ui;
    calc *sender;

<强> *。CPP

loading::loading(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::loading)
{
    ui->setupUi(this);
    ui->progressBar->setValue(0);
    sender = new calc(this);
    connect(sender, SIGNAL( inprogress(int) ), ui->progressBar, SLOT( setValue(int) ) );
}

答案 1 :(得分:0)

您需要使用基于QObject的类来建立连接

在calc头文件中,您必须从QObject继承,然后添加this

calc.h

MDM terms of use URL

有大量使用Qt信号的示例和文档。您可以开始阅读Q_OBJECT

P.S。

here也是基于对象的类,因此这里已经实现了相同的逻辑。