【发布时间】:2017-09-04 11:51:48
【问题描述】:
在我进行一些计算的一个类和另一个包含带有我的进度条的 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*&, const char*) 我是否以正确的方式使用信号,或者我误解了这个概念? >在此计算期间更新进度条值的正确方法是什么?
编辑: 将代码编辑得更清楚,现在它显示当前问题 - 信号有效,但对 qprogressbar 没有影响。
EDIT2: 现在可以工作了 - 函数必须调用 sender->doData()。另外正确的分配是sender = new calc(this)(calc *sender 添加到 mainwidnow.h 的私有部分)。谢谢大家的帮助,特别是@eyllanesc 指出正确的方法!
【问题讨论】:
-
calc 必须是基于 QObject 的。正确的方法是 class calc : public QObject { Q_Object public: calc(QObject *prnt) : QObject(prtn) {....} ..... 你创建了你的 calc 但你没有创建它。因此,当您超出构造函数范围时,您的计算示例将被销毁
-
什么时候调用doData函数?
-
当用户按下进度条下的按钮时调用,看:
void MainWindow::on_pushButton_clicked()
标签: c++ qt qt-signals qprogressbar qt-slot