2013-06-16 6 views
0
for(i=0; i<height; i++) 
{ 
    for(j=0; j<width; j++) 
    { 
     button[i][j] = new QPushButton("Empty", this); 
     button[i][j]->resize(40, 40); 
     button[i][j]->move(40*j, 40*i); 
     connect(button[i][j], SIGNAL(clicked()), this, SLOT(changeText(button[i][j]))); 
    } 
} 

Si j'ai changé changeText fonction avec la fonction (fullScreen par exemple), il travaille mais quand j'utilise une fente définie par moi (changeText) cette erreur apparaît et je ne sais pas comment résoudre ilNo such bouton fente QT

QObject::connect: No such slot buttons::changeText(&button[i][j]) 

et ceci est la fonction changeText:

void buttons::changeText(QPushButton* button) 
{ 
    button->setText("Fish"); 
} 

REMARQUE: dans le fichier d'en-tête i définie la fente comme ceci:

boutons de classe: QWidget publique

Q_OBJECT 
public slots: 
    void changeText(QPushButton* button); 
+0

bouton [i] [j] = nouveau QPushButton ("vide", ceci); QPushButton * btn = bouton [i] [j]; btn-> redimensionner (40, 40); btn-> déplacer (40 * j, 40 * i); Connect (bouton [i] [j], SIGNAL (cliqué sur)), ceci, SLOT (changeText (btn))); essayez cela. – adderly

+0

@adderly: essayez d'appeler une fonction qui n'accepte aucun paramètre avec un paramètre ... cela ne marchera pas; donc 'SLOT (changeText (btn))' ne peut pas fonctionner – Zaiborg

Répondre

4
    sous
  1. peuvent avoir moins d'arguments alors le signal, mais le type d'arguments qu'il a doivent correspondre exactement aux types d'arguments dans le signal connecté.
  2. vous ne pouvez pas avoir un emplacement dynamique comme ça.
  3. probablement ce dont vous avez besoin est un QSignalMapper.

ici est échantillon:

QSignalMapper *map = new QSignalMapper(this); 
connect (map, SIGNAL(mapped(QString)), this, SLOT(changeText(QString))); 
for(i=0; i<height; i++) 
{ 
    for(j=0; j<width; j++) 
    { 
     button[i][j] = new QPushButton("Empty", this); 
     button[i][j]->resize(40, 40); 
     button[i][j]->move(40*j, 40*i); 
     connect(button[i][j], SIGNAL(clicked()), map, SLOT(map())); 
     map->setMapping(button[i][j], QString("Something%1%2").arg(i).arg(j)); 
    } 
} 

vous pouvez probablement supprimer une table.

4

Si le SIGNAL ne fournit pas certains paramètres, le SLOT ne peut pas le recevoir. Le signal cliqué() ne fournit aucun paramètre. Les SLOT qui le reçoivent ne devraient pas en avoir non plus. Dans tous les cas, vous pouvez avoir un SLOT recevant moins de paramètres que le SIGNAL (en ignorant certains autres), mais pas autrement. Vous pouvez, cependant, de connaître l'expéditeur du signal, CAST à QPushButton * et y travailler:

void buttons::changeText() 
{ 
    QPushButton *pb = qobject_cast<QPushButton *>(sender()); 
    if (pb){ 
     pb->setText("fish"); 
    } else { 
     qDebug() << "Couldn't make the conversion properly"; 
    } 
} 
0

QButtonGroup est une classe qui a été conçu comme une collection à portée de main pour les boutons. Il vous donne un accès direct au bouton qui a déclenché la fente. Il vous offre également la possibilité d'enregistrer un bouton avec un identifiant donné. Cela peut être utile si vous voulez récupérer facilement des méta-informations à partir de l'identifiant du bouton.

QButtonGroup* buttongrp = new QButtonGroup(); 

for(i=0; i<height; i++) 
{ 
    for(j=0; j<width; j++) 
    { 
     button[i][j] = new QPushButton("Empty", this); 
     button[i][j]->resize(40, 40); 
     button[i][j]->move(40*j, 40*i); 
     buttongrp->addButton(button[i][j], i << 16 + j); 
    } 
} 

QObject::connect(buttongrp, SIGNAL(buttonClicked(int)), 
         this, SLOT(getCoordinates(int))); 
QObject::connect(buttongrp, SIGNAL(buttonClicked(QAbstractButton *)), 
        this, SLOT(changeText(QAbstractButton * button))); 

... 

void MyObject::changeText(QAbstractButton * button) 
{ 
    button->setText("Fish"); 
} 

void MyObject::getCoordinates(int id){ 
    int i = id >> 16; 
    int j = ~(i << 16) & id; 
    //use i and j. really handy if your buttons are inside a table widget 
} 

Habituellement, vous n'avez pas besoin de vous connecter aux deux emplacements. Pour l'id j'ai supposé que la taille et la largeur sont moins que 2^16. Rétrospectivement, Il me semble que vous réimplémentez certaines des fonctions du groupe de boutons.

Questions connexes