Qt4中的信号和插槽 - 不工作

Posted

技术标签:

【中文标题】Qt4中的信号和插槽 - 不工作【英文标题】:Signal and Slot in Qt4 - not working 【发布时间】:2012-11-26 11:48:38 【问题描述】:

我正在使用 Qt4 和 Qt Creator。我无法将自定义插槽写入 UI 中的进度条。如何为 ui 文件中的特定小部件编写自定义插槽?在我的场景中,信号不是来自 ui 元素。

以下代码在运行时产生错误:

ma​​inwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QFile>
#include<QFileInfo>

namespace Ui 
class MainWindow;


class MainWindow : public QMainWindow

    Q_OBJECT

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

private slots:
    void on_btcopy_clicked();
    void on_btquit_clicked();
    void ChangeValue(qint64 val);

private:
    Ui::MainWindow *ui;
;

#endif // MAINWINDOW_H

ma​​inwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);


MainWindow::~MainWindow()

    delete ui;


void MainWindow::on_btcopy_clicked()

    QFileInfo *qfi=new QFileInfo("C:\\Users\\kiran\\Desktop\\test\\a.iso");
    qDebug("%d" ,qfi->size());
    QFile *qf=new QFile();
    QFile fromFile("C:\\Users\\kiran\\Desktop\\test\\a.iso");
    QFile toFile("C:\\Users\\kiran\\Desktop\\test\\b.iso");
    ui->pbar->setMaximum(fromFile.size());
    fromFile.copy(toFile.fileName());

    connect(&toFile, SIGNAL(bytesWritten(qint64)), ui->pbar, SLOT(CangeValue(qint64)));
    qDebug("completed");


void MainWindow::on_btquit_clicked()

   exit(0);


void MainWindow::CangeValue(qint64 val)

    ui->pbar->setValue(val);

错误信息

Object::connect: No such slot ProgressBar::CangeValue(qint64)in..\untitled\mainwindow.cpp:26
    Object::connect:  (receiver name: 'pbar')

【问题讨论】:

您假设在执行 QFile::copy 时会发出任何内容。它不会。它将在文件系统上执行同步复制,而不会通知您进度。 【参考方案1】:

CangeValue 是 MainWindow 中的一个插槽(记录:它应该称为 ChangeValue)。

因此,connect(..) 语句中的第三个参数必须是主窗口,而不是进度条。在您的连接语句中将ui-&gt;pbar 替换为this

【讨论】:

我更改了它。但是在复制插槽时不起作用。您能帮帮我吗? qDebug("slot is called"); 添加到您的槽中,看看它是否真的被调用了。如果 is 被调用,您可能需要在 setValue 调用之后添加 QApplication::processEvents( QEventLoop::ExcludeUserInputEvents ); 我刚刚看到你在调用copy 之后执行connect。改变这两个的顺序。在复制整个文件之前,copy 的调用不会返回。

以上是关于Qt4中的信号和插槽 - 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Qt4 插槽和信号:Qt4 无法找到信号

Qt4 中的信号和槽

C++ 和 QT4.5 - 传递 const int& 过大?通过引用传递是不是有助于信号/插槽?

是否可以将模型对象的插槽连接到 QT4 -Designer 中的 GUI?

Qt4 现有插槽无法识别

Qt 4.8:来自不同线程的两个信号和一个插槽之间的连接行为