gpt4 book ai didi

c++ - QProgressBar 连接类之间的进度 - "no matching function for call"

转载 作者:太空宇宙 更新时间:2023-11-04 12:57:09 41 4
gpt4 key购买 nike

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

让我们调用进度条类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

主窗口.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

计算.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

计算器.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 part (code above edited) The compilation ends with this error: no matching function for call to 'loading::connect(calc*, const char*, QProgressBar*&, const char*) Do I use signals in correct way, or I misunderstand this concept? What's the >correct way to update value of progress bar during this calculations?

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

EDIT2: 现在可以工作了 - 函数必须调用 sender->doData()。此外,正确的分配是 sender = new calc(this)(将 calc *sender 添加到 mainwidnow.h 的私有(private)部分)。谢谢大家的帮助,特别是@eyllanesc 指出正确的方法!

最佳答案

只有从 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) ) );
}

关于c++ - QProgressBar 连接类之间的进度 - "no matching function for call",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036452/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com