Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    30

    [C++] Usare il metodo QObject::connect delle librerie Qt

    Quello che devo realizzare è molto semplice ma non so come si fa perché è da poco che ho cominciato ad usare le librerie Qt.
    Ho realizzato una finestra molto semplice nella quale compaiono 6 QRadioButton (A, B, C, D, E ed F rispettivamente) e un QPushButton chiamato VAI.
    L'utente per prima cosa deve cliccare su uno dei 6 QRadioButton (per scegliere l'azione che vuole fare eseguire) e poi deve cliccare sul QPushButton per farla eseguire al programma.
    N.B.:Per me è determinante sapere quale QRadioButton è stato premuto perché ognuno di essi corrisponde ad un metodo diverso.
    Se stessimo parlando di HTML tutto questo sarebbe un banalissimo form, ma con le Qt come si fa?
    P.S.:Ho provato con QObject::connect ma non riesco ad usarlo come vorrei.

  2. #2
    Io farei così:
    definisci un'enum di qualche genere corrispondente alle azioni da effettuare; nel costruttore del QDialog, QMainWindow o quello che è memorizzalo in una property di ciascun radiobutton:
    codice:
    ui->rbPrimoPulsante->setProperty("azione", PrimaAzione);
    ui->rbPrimoPulsante->setProperty("azione", SecondaAzione);
    // eccetera
    Quindi crea uno slot del form del tipo
    codice:
    public slots:
        void rb_clicked(bool Checked);
    e lega il signal clicked di tutti i radiobutton allo slot in questione, mettendo sempre nel costruttore:
    codice:
    connect(ui->rbPrimoPulsante, SIGNAL(clicked(bool)), this, SLOT(rb_clicked(bool));
    // idem per gli altri radiobutton
    Nel codice dello slot memorizza l'azione del pulsante premuto in una qualche variabile definita a livello di classe:
    codice:
    void NomeForm::rb_clicked(bool Checked)
    {
        if(Checked)
            this->azione=sender()->getProperty("azione").toInt();
    }
    A quel punto puoi far generare automaticamente lo slot per il QPushButton al designer del form (click di destro sul button->go to slots->clicked()); qui dentro potrai controllare this->azione e in base a quello fare un'azione o l'altra.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Precisamente, cos'è che non riesci a fare? Devi connettere uno slot al bottone in questione che venga eseguito quando ci si clicka sopra, e nello slot vai a controllare i singoli radio buttons per determinare quale sia stato checkato (col metodo isChecked() della classe QRadioButton) e agire di conseguenza.
    Specifica meglio il problema, magari postando del codice per ragionare con qualcosa di concreto.
    every day above ground is a good one

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    30
    @MItaly: puoi dirmi come faccio a creare un enum nella sitassi del c++11? So che rispetto alle versioni precedenti è cambiata (e presumo che tu ti riferisca a questa sintassi)
    @YuYevon: hai centrato il problema in pieno

    Se serve ecco il codice:

    /*La finestra la costruisco nel costruttore della classe mywindow, lì c'è un pulsante che una volta cliccato mi permette di accedere al metodo clickedSlot(), è proprio in questo metodo che mi trovo alle prese con il problema che ho detto prima. Non metto il costruttore perché non c'entra nulla con il problema*/
    void mywindow::clickedSlot()
    {
    QDialog *w = new QDialog(this);
    w->setModal(true);
    QRadioButton *A = new QRadioButton("A",w), *B = new QRadioButton("B",w);
    QRadioButton *C = new QRadioButton("C",w), *D = new QRadioButton("D",w);
    QRadioButton *E = new QRadioButton("E",w), *F = new QRadioButton("F",w);
    QPushButton *vai = new QPushButton("Vai!",w);

    B->move(0,20);
    C->move(0,40);
    D->move(0,60);
    E->move(0,80);
    F->move(0,100);
    vai->move(300,200);

    QObject::connect(/*Usare questo metodo in qualche modo*/);
    w->setFixedSize(400,250);
    w->move(QApplication::desktop()->screen()->rect().center() - w->rect().center());w->show();
    }

    void mywindow::actionSlot()
    {
    //Azioni da eseguire a seconda del QRadioButton che è stato selezionato
    }

    Ultima modifica di gila89; 19-10-2013 a 15:20

  5. #5
    Il C++11 ha aggiunto una nuovo tipo di enum(strongly typed enum), ma ha mantenuto anche quella classica del C. Per maggiori informazioni guarda la documentazione online(link sotto). In questo caso penso possa bastare anche il vecchio tipo di enum.

    Per quanto riguarda connect basta guardare la documentazione online(link sotto).
    Nel tuo caso connect sarà una cosa del genere:
    codice:
    connect(vai,SIGNAL(clicked()),this,SLOT(actionSlot()));

    In actionSlot controllerai quale radio button è stato selezionato con qualcosa tipo:
    codice:
    void mywindow::actionSlot()
    {
        if( a->isChecked() )          { /*codice */ }
    
       else if( b->isChecked() )  {  /*altro codice */ }
    
        //etc...
    }

    Links:
    C++11 enum: http://en.cppreference.com/w/cpp/language/enum
    QObject::connect: http://qt-project.org/doc/qt-5.0/qtc...html#connect-3

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    30
    Ho capito. Va bene se l'enum lo definisco così?

    codice:
    enum azioni{
        PrimaAzione,
        SecondaAzione,
        TerzaAzione,
        //etc. etc.
    };

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Quote Originariamente inviata da lovesemiramide Visualizza il messaggio
    In actionSlot controllerai quale radio button è stato selezionato con qualcosa tipo:
    codice:
    void mywindow::actionSlot()
    {
        if( a->isChecked() )          { /*codice */ }
    
       else if( b->isChecked() )  {  /*altro codice */ }
    
        //etc...
    }
    in realtà non può farlo perché i radiobuttons A, B etc. sono dichiarati e costruiti localmente al costruttore della finestra, pertanto non referenziabili dallo slot.
    Si può risolvere in maniera quick 'n' dirty dichiarando tutti quei widgets come campi della classe stessa (nell'header file relativo) per poi costruirli nel costruttore come è fatto ora, in questo modo saranno referenziabili anche nello slot (che appartiene alla stessa classe).
    Un modo più raffinato e strutturato per affrontare la cosa consiste nel creare una classe con una form associata: la form può essere disegnata con il QtDesigner e all'interno della classe i widgets possono essere referenziati con il namespace ui (rimando alla documentazione per dettagli).
    every day above ground is a good one

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    30
    Grazie ai vostri suggerimenti ho risolto
    Grazie mille a tutti!!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.