2012-11-26 33 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);',但未調用該插槽。 –