2015-09-09 4 views
0

Je suis en train de régler la connect() comme ceci:connect() ne peut pas trouver la fonction de signal

QObject::connect(&webControl, 
       SIGNAL(Ui::MainWindow::loadFinished(bool)), 
       &w, 
       SLOT(Ui::MainWindow::loadFinished(bool))); 

en fonction main() mais il donne l'erreur:

QObject::connect: No such signal QWebView::Ui::MainWindow::loadFinished(bool)

w et webControl sont déclaré comme ceci:

MainWindow w; 
QWebView webControl; 

Et voici mes fichiers:

mainwindow.h

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
public slots: 
    void loadFinished(bool arg1); 
private: 
    Ui::MainWindow *ui; 
}; 

mainwindow.cpp

void MainWindow::loadFinished(bool arg1) 
{ 
} 

Pourquoi je reçois cette erreur et comment puis-je résoudre ce problème?

+0

Vous n'avez pas besoin que tous les qualificatifs pour SIGNAL et SLOT macro: SIGNAL (Ui :: MainWindow :: loadFinished (bool)) . Faites simplement SIGNAL (loadFinished (bool)) – AlexanderVX

+1

Il n'y a en effet aucun signal. Vous prenez juste la fente et la mettez en tant que signal et fente. – Blacktempel

+0

@AlexanderVX: Cela a fonctionné pour l'appel 'connect()' dans 'main()' mais pas à partir d'une autre méthode de la classe 'MainWIndow'. Il donne la même erreur – Jack

Répondre

1

Votre problème est que Webcontrol est un qwebview et votre signal est non t dans QWebview, mais dans MainWindow. Vous avez besoin de ce signal dans QWebView. C'est pourquoi il se plaint d'un signal qui ne peut être trouvé.

EDIT

Vous avez un problème de savoir ce qui est une fente, et ce signal. Tes deux choses sont différentes. Un signal est comme une alarme. Une fente est le récepteur et cela fonctionne comme une fonction normale.

Si vous voulez que votre webControl var soit l'expéditeur, vous devez déclarer le signal comme ceci dans votre QWebView.classe h:

signals: 
    void yourSignalName(bool arg1); 

et utiliser le connecter comme ceci:

QObject::connect(&webControl, 
      SIGNAL(yourSignalName(bool)), 
      &w, 
      SLOT(loadFinished(bool))); 
+0

Vous voulez dire que mes slots et signaux doivent être définis dans une classe qui hérite de 'QWebView' pour le travail de slot pour' webControl'? – Jack

+0

Je veux dire que la logique de la connexion est: objet qui veut envoyer le signal, le nom du signal, objet qui reçoit le signal et faire quelque chose sur la fente, le nom de l'emplacement. Donc, dans votre connexion, vous avez: '& webControl, SIGNAL (Ui :: MainWindow :: loadFinished (bool)),' ce qui signifie que webControl enverra un signal, mais alors vous dites que le signal est loadFinished de Ui :: MainWindow qui n'a pas de logique. Ce loadFinished devrait être déclaré min la classe webControl – Megasa3

+0

voir ma modification, j'espère que vous le comprenez plus maintenant – Megasa3

0

Je vous suggère la nouvelle syntaxe QT5 (qui est facultatif):

QObject::connect(&webControl, &Ui::MainWindow::loadFinished, 
       &w, &Ui::MainWindow::loadFinished); 

plus sur la nouvelle syntaxe: http://wiki.qt.io/New_Signal_Slot_Syntax

+0

il utilise qt 3.3 donc c'est une mauvaise idée – Megasa3

+0

@ Megasa3 J'utilise une sorte de QT différent, il utilise MinGw par défaut. Il est basé sur QT 5.4.0. Je suppose que c'est pourquoi cela compile mais n'a pas résolu le problème – Jack

+0

oh! Pardon! J'ai vu qu'il utilise MinGw mais ne savait pas que c'était basé sur 5.4.0. Pardon! ma faute! – Megasa3

2

Vous devez ajouter à votre QWebView *webView;mainwindow.h:

mainwindow.h

namespace Ui { 
class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    Q_OBJECT 

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

public slots: 
    void loadFinished(bool arg1); 
    void setWebView(QWebView *webControl); 

private: 
    Ui::MainWindow *ui; 
    QWebView *webView; 
}; 

mainwindow.cpp

... 

QWebView *MainWindow::getWebView() const 
{ 
    return webView; 
} 

void MainWindow::setWebView(QWebView *webControl) 
{ 
    webView = webControl; 
    QObject::connect(webControl, 
        SIGNAL(loadFinished(bool)), 
        this, 
        SLOT(loadFinished(bool))); 
} 

Si vous avez vraiment besoin de déclaration QWebView dans main.cpp puis passer le pointeur à setWebView() fonction:

main.cpp

#include "mainwindow.h" 
#include <QApplication> 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    MainWindow w; 
    QWebView webControl; 
    w.setWebView(&webControl); 

    w.show(); 

    return a.exec(); 
}