QT: Aucun Logement de
Problème est que je reçois le "rien de Tel Fente" erreur d'exécution dans Qt Creator chaque fois que je lance un "paramètres" de la fenêtre de ma fenêtre principale. J'ai trouvé Qt pour être tout à fait contre-intuitif si loin et cette machine à sous 'n des signaux concept semble un peu exagéré, à partir d'un simple passage de vars ou des appels de fonction. J'ai un menu avec une option de paramètres, que quand on clique dessus, ouvre une fenêtre de réglages qui doit attraper un double de l'utilisateur et de mettre à jour une variable dans la fenêtre principale.
SettingsWindow.h
class SettingsWindow : public QWidget
{
Q_OBJECT
public:
SettingsWindow(QWidget *parent = 0);
signals:
void ValChanged(double newVal);
public slots:
void Accept();
private:
QLineEdit *le1;
};
La fenêtre des paramètres a un bouton "accepter", qui appelle Accept() qui émet de la ValChanged signal avec newVal définir comme la saisie de l'utilisateur dans le1 comme un double.
SettingsWindow.cpp
void SettingsWindow::Accept(){
emit ValChanged(le1->text().toDouble());
this->close();
}
Les paramètres de cette fenêtre est appelée par le fenêtre principale de l'application: MainWindow
MainWindow.cpp
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
public slots:
void SetVal(double x);
private slots:
void NewWindow();
private:
double theVal;
};
Cette fenêtre principale dispose d'un menu dont l'un serait sélectionnez paramètres. Cela crée une nouvelle fenêtre avec un champ pour un pour entrer un numéro.
MainWindow.cpp
void MainWindow::NewWindow()
{
SettingsWindow *MySettings=new SettingsWindow(this);
QObject::connect(MySettings, SIGNAL(ValChanged(double)), this, SLOT(SetVal(double)));
MySettings->show();
MySettings->raise();
}
void MainWindow::SetVal(double x){
theVal = x;
}
Mon espoir est que lorsque les paramètres de la fenêtre est ouverte, l'utilisateur peut entrer un val dans le champ qui émet alors l'ValChanged Signal qui définit theVal à la valeur spécifiée par l'utilisateur. La plupart du temps j'ai vu une émission avec des gens de ne pas y compris les macro q_object, mais je l'ai inclus deux fois. Toutes les suggestions sur pourquoi cela ne fonctionne pas?
qt_metacall(QMetaObject::Call _c, int _id, void **_a)
?Ouais, il est là. Il devra être défini.
Quelques questions pour obtenir des éclaircissements.. quelle fente est nommé dans le message d'erreur "No such slot"? Comment est la "Accepter" slot appelé?
Object::connect: No such slot MainWindow::SetVal(double x)
Soit vous avez mal cité le message d'erreur, ou vous miscopied votre code. Le message d'erreur doit être
No such slot: MainWindow::SetVal(double)
(sans le x
). Si le message d'erreur est correcte, et que votre code est vraiment SLOT(SetVal(double x))
, alors vous pouvez résoudre le problème en supprimant le x
.
OriginalL'auteur user850275 | 2011-07-18
Vous devez vous connecter pour publier un commentaire.
Le problème que vous rencontrez est presque certainement due à un moc de fichiers à ne pas être recréée, une faute de frappe dans votre appel pour vous connecter ou une faute de frappe dans la déclaration de la fente en question.
Vous pouvez considérer que c'est beaucoup plus de travail que nécessaire pour l'obtention d'entrée à partir d'une boîte de dialogue. Une méthode plus simple serait de connecter le bouton "Accepter" cliqué signal à un slot dans la fenêtre principale, puis extraire la valeur que vous voulez directement à partir de l'instance de la fenêtre de paramètres par le biais d'un
getXXX()
méthode.Si finalement vous avez une boîte de dialogue paramètres avec beaucoup de valeurs, au lieu de récupérer chaque valeur par le biais du getters, ont le bouton "Accepter" de retour de signal sur une structure avec toutes les valeurs de champs de structure.
Je dois mentionner qu'il ressemble à
NewWindow()
crée une nouvelle instance deSettingsWindow
chaque fois qu'elle est appelée. Toutes ces instances vont persister jusqu'à ce que leMainWindow
est détruit.Je peux comprendre votre frustration, surtout si vous n'avez pas travaillé avec fenêtrage cadres avant. C'est un vaste bibliothèque de se familiariser avec. Qt est parmi les mieux documentés des bibliothèques, vous trouverez et riche d'exemples et de démonstrations. Malheureusement, la plupart d'entre eux sont très ciblé sur un seul élément et sont dépourvues, complet, meilleures pratiques "application" des exemples. Parfois, vous trouverez un de la démo ou d'exemples avez des informations précieuses comme un effet secondaire. L'intervalle Qt programmeurs ici sont sympathiques et utiles afin de garder les questions à venir.
Et bien merci pour l'aide! J'ai décidé d'utiliser vos décrit la méthode de configuration d'un getter pour faire le travail, et il semble fonctionner maintenant. Considérez cela a résolu.
OriginalL'auteur Arnold Spence
Pour moi, l'ajout d'un
public Q_SLOTS:
au-dessus de mon logement de fonction était ce qui me manquait. (J'ai déjà eu macro q_object, etc.)OriginalL'auteur Cameron
J'ai résolu mon problème quand j'ai recréé manuellement mon moc fichier sur la ligne de commande.
J'ai utilisé qt option d'invite de commande de sorte que tous les chemins ont été définies:
Il n'y a rien de mal avec mon code, et mon makefile n'ai pas de moc commande j'ai pu voir. Cela fonctionne pour tous mes exemples, j'ai essayé. J'espère que quelqu'un pourrait essayer cela aussi. J'ai testé pour près de 85 heures avant que je puisse en trouver la cause.
Pour codeblocks utilisateurs, essayez de recréer votre moc fichiers pour être précis.
le
-o myheaderfile.cpp
option est de sauver la moc sortie vers un fichier.L'exécution de moc sur le fichier crache tout sur la fenêtre de la console.
OriginalL'auteur Cool Guy CG
J'ai été incorrectement essayer de passer un paramètre à ma fente sans
QSignalMapper
, j'ai appris de cette DONC post.Suppression de tous les paramètres de la fente de la fonction (.h et .rpc) a permis à la fonction de rappel pour être trouvé et l'a appelé.
Oui, je suis un Qt n00b. Le temps de revoir avec QSignalMapper 🙂
HTH
OriginalL'auteur GraehamF