2009-09-08 7 views
0

J'ai récemment travaillé sur l'apprentissage de C++ et de Qt4, mais j'ai rencontré un problème.Emplacement apparemment non reconnu dans l'application Qt

je la classe et la mise en œuvre suivante:

class Window : public QWidget 
{ 
public: 
    Window(); 

public slots: 
    void run(); 

private: 
    //... 
}; 

et

Window::Window() 
{ 
    //... 

    connect(runBtn,SIGNAL(clicked()),this,SLOT(run())); 

    //... 
} 
Window::run() 
{ 
    //... 
} 

Cependant, lorsque je tente de construire et de l'exécuter, bien qu'il construit très bien, il sort immédiatement avec la message

Object::connect: No such slot QWidget::run() 

Sauf si j'ai fait quelque chose de mal, Qt ne semble pas être reconnu nizing the slot run()

Pourriez-vous nous aider s'il vous plaît?


Mise à jour:

Le code est maintenant:

class Window : public QWidget 
{ 
    Q_OBJECT 
public: 
    Window(QWidget *parent = 0); 

public slots: 
    void run(); 

private: 
    //... 
}; 

et

Window::Window(QWidget *parent) : QWidget(parent) 
{ 
    //... 

    connect(runBtn,SIGNAL(clicked()),this,SLOT(run())); 

    //... 
} 
Window::run() 
{ 
    //... 
} 

Le programme encore "de façon inattendue fini", mais ne me dites qu'il y est une telle chose que QWidget::run()

+0

Est-ce code * droite * copypaste à partir de votre code réel? Parce que l'erreur que vous décrivez se produit généralement si votre slot run() a un paramètre mais que vous ne définissez pas dans la macro SLOT? C'est-à-dire, cette même erreur à l'exécution, pas ce crash. Aussi, vous devriez appeler le constructeur des parents aussi. – rasjani

+0

Nous ne pouvons pas vous dire pourquoi il se bloque à partir du code que vous avez collé. Il y a probablement un bogue dans un autre code que vous avez écrit mais qui n'est pas affiché. – rohanpm

+0

"slots publics:", comment ça marche? jamais vu cette syntaxe? –

Répondre

8

Vous avez peut-être oublié une macro Q_OBJECT dans votre classe Window?

class Window : public QWidget 
{ 
Q_OBJECT 
public: 
    Window() 
... 
+0

Apparemment, oui j'ai. Après l'avoir ajouté, cependant, il s'est tout de même écrasé immédiatement, et a quitté le code 0. –

+0

@Austin, n'oubliez pas de relancer qmake après cela, car il devra ajouter votre fichier à la liste des éléments à exécuter le MOC, qui affectera également le comportement au moment de l'exécution. –

+0

Avez-vous une pile de pile? Quoi qu'il en soit, je recommande de lire les tutoriels Qt, qui font partie de la documentation Qt. Ils sont très bien écrits et vont pas à pas. En outre, il existe de nombreux exemples d'utilisation des classes les plus courantes qui valent le coup d'œil. – hirschhornsalz

1

Qu'est-ce que runBtn, et comment est-il créé? Si elle est créée dans le cadre d'un fichier ui, appelez-vous setupUi()? Comment votre classe de fenêtre est-elle créée? Vous semblez avoir omis du code (// ...) qui peut être l'endroit où se trouve l'erreur.

Le meilleur conseil que je peux donner pour essayer de réduire votre problème à un très petit exemple compilable. Cela aide pour deux raisons:

  1. Il aide vous diagnostiquer le problème, car il y aura moins de code à regarder.
  2. Si vous avez encore besoin de notre aide, cela nous aidera us puisque nous aurons une base de code complète que nous pourrons télécharger, compiler et déboguer. Souvent, le problème n'est pas là où vous pensez que c'est.

Hope this helps.

0

On dirait que runBtn n'est pas instancié au moment où connect est appelé - comme l'implique l'une des autres réponses.

Utilisez les points d'arrêt pour vérifier où le crash se produit.

2

Eh bien, j'avais aussi ce problème et je n'ai trouvé aucune aide en ligne. J'ai découvert que j'oublie de supprimer les fichiers moc_ * avant de recompiler et qu'il utilise les anciens fichiers moc pour créer le fichier exécutable. Cela l'a empêché de connaître les nouveaux emplacements que j'avais codés. Je vérifierais cela si toutes les autres suggestions échouaient.

Parfois, la solution la plus simple est la meilleure solution ...

Questions connexes