Comment puis-je émettre un signal à partir d'une autre classe?
J'ai un problème avec mon application Qt. Je suis en train d'émettre un signal à partir d'une autre classe (c'est une classe imbriquée l'une dans laquelle le signal est placé).
J'ai déjà connecté le signal avec une fente, ce qui devrait être suffisant. Mais quand j'essaie d'émettre ce signal à l'intérieur de cette classe imbriquée j'obtiens l'erreur de compilateur:
ne peut pas appeler la fonction membre sans objet
Quel est le problème? J'ai regardé pour que, dans la documentation de Qt, mais ne pouvait pas trouver de solution raisonnable ou même explication.
De la simplification de la définition de la classe se présente comme suit.
class LogWriter : public QDialog
{
Q_OBJECT
public:
class Log : public QObject
{
Q_OBJECT
public:
bool print;
Log(bool _print, QString _color, QObject *obj = NULL)
: QObject(obj)
{
print = _print;
color = _color;
}
};
LogWriter(QWidget * parent = 0);
~LogWriter();
public slots:
void setMinVal();
void setMediumVal();
void setHighVal();
void cleanWindow();
void appendText(QString &text);
signals:
void signalLogAppend(QString);
};
- Je connecter le signal d'une instance LOW
de l'écriture de journal dans le code du client pour certains fente à l'aide de l'appel de fonction suivant:
connect(&LOW, SIGNAL(signalLogAppend(QString)),
this, SLOT(appendText(QString&)),
Qt::DirectConnection);
- Est
LOW
le bon type d'objet? - Ce qui est FAIBLE? Il y a un peu de code manquant pour vous donner une analyse adéquate.
- FAIBLE représente Journal de classe - une classe interne je l'ai mentionné dans le post
- Vous ne savez pas si
moc
joue de nice avec imbriqué définition de la classe.
Vous devez vous connecter pour publier un commentaire.
À comprendre le problème que vous avez à comprendre comment les signaux sont émis:
Ils sont tout simplement un non-membre statique d'appel de fonction, et nécessitent donc une instance d'être appelé (l ' "expéditeur"). Généralement, cette instance est
this
(si vous émettre le signal à partir d'un autre non-statique de la fonction de membre de la même classe), de sorte que la syntaxe d'appel devient normal d'un appel de fonction sans (littérale) de l'instance. Leemit
mot clé est facultatif et est tout simplement une macro qui se développe pour rien. Quatre versions sont quand même écrit dans une fonction membre de la même classe qui contient le signal:Si vous émettre le signal de l'extérieur de la classe se trouvant à l'intérieur de la classe, le
this
pointeur se réfère à une instance de l'intérieur de la classe et donc il y a quelque instance manquant pour l'extérieur de la classe. C'est le même que si vous appelez de toute autre fonction de l'extérieur de la classe se trouvant à l'intérieur de la classe: le compilateur ne sait pas sur lequel l'instance de l'objet (de l'extérieur de la classe) d'appeler. Donc, vous devez écrire quelque chose comme:Ici,
someLogWriter
est l'instance deLogWriter
pour lequel vous souhaitez émettre le signal.ptr-> signalLogAppend()
(notez l'espace), qui doit être valide.