Comment passer des variables à fente méthodes dans QT?
Je suis en train de faire un peu de conversation messenger programme, qui a besoin d'une liste de canaux de discussion de l'utilisateur a rejoint. Pour représenter cette liste graphiquement, j'ai fait une liste de QPushButtons
, qui représentent un canal différent. Ces boutons sont réalisés avec la méthode suivante, et c'est là mon problème coups de pied dans:
void Messenger::addToActivePanels(std::string& channel)
{
activePanelsContents = this->findChild<QWidget *>(QString("activePanelsContents"));
pushButton = new QPushButton(activePanelsContents);
pushButton->setObjectName("pushButton");
pushButton->setGeometry(QRect(0, 0, 60, 60));
pushButton->setText("");
pushButton->setToolTip(QString(channel.c_str()));
pushButton->setCheckable(true);
pushButton->setChecked(false);
connect(pushButton, SIGNAL(clicked()), this, SLOT(switchTab(channel)));
}
(activePanelContents est un QWidget qui détient la liste.)
Le point est que chaque bouton doit appeler le switchTab(string& tabname)
méthode lorsque l'utilisateur clique dessus, y compris le canal du nom de la variable. Cette application ne fonctionne pas bien, et je n'ai pas été en mesure de savoir comment bien le faire.
OriginalL'auteur Neko | 2011-02-07
Vous devez vous connecter pour publier un commentaire.
Pour les chaînes et les nombres entiers, vous pouvez utiliser QSignalMapper. Dans votre
Messenger
classe, vous ajoutez unQSignalMapper mapper
objet, et votre fonction:et après que vous avez ajouté tous les canaux de vos panneaux, vous appelez
Ne
switchTab()
prendre unconst QString &
? Si cela ne fonctionne pas, vous devez le modifier de sorte qu'il n'. Qt ne vous permettra pas de passerstd::string
(ou, en général, tout type pas enregistré avecqRegisterMetaType
) par des signaux et des slots. Fautes de frappe à l'intérieur deSIGNAL
etSLOT
ne sont pas détectés avant l'exécution, parce que ces macros tourner leurs arguments dans les chaînes. Les Chances sont que Qt est l'impression d'un message d'erreur de la console lorsqu'il tente d'établir la connexion àswitchTab(const QString &)
.OriginalL'auteur Daniel Gallagher
Utilisation
QSignalMapper
de passer des variables;dans le logement j'.e
Espère que mon sna peuvent vous aider à
OriginalL'auteur Sharanabasu Angadi
N'utilisez pas l'expéditeur méthode, sauf si vous devez absolument. Il relie directement la fonction pour être utilisé uniquement comme une fente (ne peut pas être appelé directement). Conserver le comportement d'avoir la fonction qui accepte une chaîne de caractères et faire simplement un mécanisme par lequel vous pouvez l'appeler.
Une méthode, parmi d'autres, vous pouvez trouver, est de tirer parti de l'utilisation de QSignalMapper. Il va les objets de la carte des valeurs et de régénérer les signaux de la signature appropriée.
OriginalL'auteur Crazy Eddie
Je le ferais avec "le relais" des objets:
Créer
TabSwitchRelay
qui est une sous-classe deQObject
avec ce constructeur:Il dispose également d'un slot
clicked()
:Maintenant, remplacez la ligne dans votre code qui peut se connecter avec ce:
Il n'est pas testé, mais vous obtenez l'idée de base.
OriginalL'auteur Stephen Chu
Vous pourriez essayer d'avoir votre
switchTab
fente de ne prendre aucun argument et l'utilisationQObject::sender (expéditeur)
pour obtenir l'objet qui a envoyé le signal.Je ne sais pas pourquoi votre post a été minused, mais merci quand même. Vous a aidé beaucoup
OriginalL'auteur spbots
si vous utilisez Qt5, vous pouvez le faire par lambda:
OriginalL'auteur Moia