2017-06-24 1 views
0

Je suis nouveau à Qt et en essayant d'écrire le signal et l'emplacement. Voici le code que j'essayais de lancer. avec des mots-clés SLOT et SIGNAL sur la fonction "connect", cela fonctionne très bien. Mais je ne veux pas utiliser les mots-clés SIGNAL et SLOT sur la fonction de connexion, mais plutôt utiliser une approche différente.QT signal et l'emplacement ne fonctionne pas donnant un message d'erreur

class MyWindow:public QMainWindow 
    { 
     Q_OBJECT 
    public: 
     MyWindow(); 
    }; 

    MyWindow::MyWindow() 
    { 
    QWidget *widget=new QWidget; 
    QHBoxLayout *layout =new QHBoxLayout; 
    QSpinBox *mySlide = new QSpinBox; 
    mySlide->setRange(0,10); 
    QLCDNumber *lcdNumber= new QLCDNumber; 
    layout->addWidget(mySlide); 
    layout->addWidget(lcdNumber); 

     connect(mySlide,SIGNAL(valueChanged(int)),lcdNumber,SLOT(display(int))); 
    // connect(mySlide, &QSpinBox::valueChanged,lcdNumber, &QLCDNumber::display); 

     widget->setLayout(layout); 
     setCentralWidget(widget); 
    } 

Dans le code ci-dessus, la fonction décommentée connexion fonctionne très bien, mais la fonction de connexion ne commenté fonctionne pas. Je reçois erreur "aucune fonction correspondante pour appeler MyWindow :: connect". Je ne sais pas quelle erreur j'ai faite ici. Je suivais cet article de qt.

http://doc.qt.io/qt-5/qtopengl-hellogl2-window-cpp.html

Répondre

1

Le problème est que tant le signal - QSpinBox::valueChanged - et la fente - QLCDNumber::display - ont de multiples surcharges pour les différents types d'arguments. Vous avez quelques options.

1) Utiliser un static_cast pour lever l'ambiguïté entre les différentes surcharges de signal et sous ...

connect(mySlide, 
     static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), 
     lcdNumber, 
     static_cast<void(QLCDNumber::*)(int)>(&QLCDNumber::display)); 

ou ...

2) il suffit d'utiliser un lambda ...

connect(mySlide, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), 
     [lcdNumber](int value) 
     { 
      lcdNumber->display(value); 
     }); 

Bien que l'utilisation du lambda still nécessite un static_cast sur le signal.

+0

Merci beaucoup. Cela a fonctionné. Mais juste curieux de savoir pourquoi connecter (mySlide, SIGNAL (valueChanged (int)), lcdNumber, & QLCDNumber :: affichage) ne fonctionnait pas. la première partie est explicitement signalée. – LilRazi

+0

Vous ne pouvez pas mélanger et faire correspondre les différentes syntaxes de signal/emplacement. C'est soit toute la syntaxe SIGNAL et SLOT * ou * le nouveau pointeur vers la syntaxe membre. –