2012-11-26 32 views
0

我正在使用Qt4和Qt Creator。我无法在UI中为进度条编写自定义插槽。如何在ui文件中为特定小部件编写自定义插槽?在我的情况下,信号不是来自ui元素。Qt4中的信号和插槽 - 无法正常工作

下面的代码运行时产生一个错误:

mainwindow.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 

mainwindow.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') 
+0

你认为做QFile :: copy时会发射任何东西。它不会。它将在文件系统上执行同步复制而不通知您进度。 –

回答

5

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

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

+0

我改变了它,但在复制插槽不工作。请你帮我吗? –

+0

将'qDebug(“slot is called”);'添加到您的插槽以查看它是否实际被调用。如果is被调用,则可能必须在'setValue'调用 –

+0

之后添加'QApplication :: processEvents(QEventLoop :: ExcludeUserInputEvents);',但未调用该插槽。 –