我在一个类中进行正确的信号和插槽设置有一些麻烦,我在其中进行一些计算,另一个类包含带有我的进度条的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以正确的方式!
答案 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)