2011-08-24 22 views
7

için eşleme işlevi yok MainWindow ve QNAMRedirect sınıfları var ve derleme programı derlemeye çalışırken derleyici hatası alıyorum. İşte QT 'MainWindow :: connect()

QNAMRedirect sınıftır:

class QNAMRedirect : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit QNAMRedirect(QObject *parent = 0); 
    ~QNAMRedirect(); 

signals: 

public slots: 
    void doRequest(); 
    void replyFinished(QNetworkReply* reply); 
signals: 
    void finished(QString); 

private: 
     QPointer<QNetworkAccessManager> _qnam; 
     QUrl _originalUrl; 
     QUrl _urlRedirectedTo; 
     QNetworkAccessManager* createQNAM(); 

}; 

ve burada MainWindow sınıftır:

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

private slots: 
    void on_request_clicked(); 

private: 
    Ui::MainWindow *ui; 
}; 

ve ben MainWindow bu şekilde NAMRedirect::finished(QString) sinyal Widget QTextEdit bağlanmaya çalışıyorum:

void MainWindow::on_request_clicked() 
{ 
    QNAMRedirect urlGet(this); 
    QObject::connect(urlGet,SIGNAL(finished(QString)),ui->textEdit,SLOT(setText(QString))); 

    urlGet.doRequest(); 

} 

ama derleyici hatası alıyorum: Bu sorunu nasıl giderebilirim?

cevap

7

Derleme hatasının nedeni, connect() işlevine ilettiğiniz iki nesnenin işaretçi olması gerektiğidir. Yani & urlGet (sadece urlGet yerine) kullanarak derleme hatasını düzeltir. Ancak, kısa sürede işlevin döndürdüğü olarak bu nesne kapsam dışında gidecek ve imha edilmesi, bu yüzden daha böyle bir şey bakmak için işlevini değiştirmek önermek:

QNAMRedirect *urlGet = new QNAMRedirect(this) 
QObject::connect(urlGet,SIGNAL(finished(QString)),ui->textEdit,SLOT(setText(QString))); 
urlGet->doRequest(); 

Elbette, önlem almak gerekir Burada hafıza kaçırmıyorsun.

+0

çok teşekkür ederim :) –

+1

Yeni Qt5 sözdizimini kullanmak için bağlantılarınızı değiştirmek iyi olabilir. Avantajları, herhangi bir uyumsuzluğun derlenme zamanında bildirim almanızdır –