Costruttore



  • Salve avrei bisogno di sapere una cosa:
    io all'avvio di un programma vorrei poter visualizzare una finestra e nel contempo sopra una finestra di dialogo che appare sopra la precedente.
    Come devo gestire il costruttore della MainWindow per poter visualizzare anche questa finestra di dialogo?
    Per la main window non ho avuto problemi a crearla, ma la finestra di dialogo (appartente ad una classe per esempio Dialogo) l'ho creata, ma non so come deve essere correttamente inizializzata e dove.
    Ho provato a creare un puntatore della classe Dialogo come membro privato di MainWindow, ma poi non sapevo come inizializzare l'oggetto.
    Qualcuno può suggerirmelo?



  • Non e' mai una buona idea bloccare un costruttore quindi in MainWindow crea, sotto private:

    Q_SLOT void mostraDialogo(){
    Dialogo mioDialogo(this);
    mioDialogo.exec();
    }
    

    ora nel costruttore di MainWindow aggiungi QTimer::singleShot(0,this,&MainWindow::mostraDialogo); (ricordati #include <QTimer> in cima al file)



  • Mi dice che l'inizializzazione membro non è valida , che single shot non è una base n.
    Ti metto il codice dove mi hai detto di modificare, in modo che puoi dirmi se ho fatto bene o ho commesso un errore madornale

    #include "dialog.h"
    #include <QTimer>
    
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
        QString ricezione;
    
    
    private slots:
        void on_pushButton_clicked();
    
    private:
        Ui::MainWindow *ui;
        Q_SLOT void MainWindow::mostraDialogo(){
        Dialog mioDialogo(this);
        mioDialogo.exec();
        }
    
    
    };
    
    #endif // MAINWINDOW_H
    
    
    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    
    
    
    
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),QTimer::singleShot(0,this,&MainWindow::mostraDialogo),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::on_pushButton_clicked()
    {
        ricezione = ui->ValoreNumerico->text();
        qDebug() << ricezione;
    }
    
    


  • QTimer::singleShot(0,this,&MainWindow::mostraDialogo); va dopo ui->setupUi(this); non nella lista di inizializzazione



  • Perfetto ha funzionato;
    grazie mille. Adesso una volta che ho finito provo a inserirla nel programma che mi interessa poi ti dico.



  • Ecco allora il mio intento era quello di far apparire una finestra di dialogo con la quale io inserendo una stringa e poi dando OK andavo ad assegnare il valore ad una stringa membro della MainWindow.
    Tengo questo come un esercizio per poi applicarlo ad un software per database.
    Ora però mi sono trovato fregato perchè essendo di due classi diverse non so come gestire la cosa e ho provato una mezza sciocchezza (meglio sbagliare che non fare) e volevo sapere se l'idea era buona e se si come devo correggere:

    Provo con un signal/slot
    in Dialog.h aggiungo:

    public:
        
     .....
        void emissioneRiga (const QLineEdit &invio);//emissione del segnale
    signals:
        void clicked(QLineEdit); // segnale emesso
    ......
    

    e in Dialog .cpp aggiungo:

    void emissioneRiga (const QLineEdit &invio)
    {
        emit clicked(invio);
    }
    

    in MainWindow.h aggiungo:

    private slots:
        ....
        void ricezioneDaDialog(QLineEdit &Dialog::clicked());  
    

    In MaiWindow.cpp

    void MainWindow::ricezioneDaDialog(QLineEdit &Dialog::clicked())
    {
        ricezione = Dialog::mioDialogo.text(); //ricezione è la stringa membro di MainWindow
        qDebug() << ricezione;
    }
    

    mentre nel main.cpp

    QObject::connect(Dialog::mioDialogo, SIGNAL(clicked(QLineEdit)),MainWindow::w, SLOT (ricezioneDaDialog(QLineEdit &Dialog::clicked()));
    

    Non ho aggiunto la funzione perchè non mi convince molto questa scelta e vorrei qualche delucidazione



  • L'hai fatto molto piu' difficile di quanto in realta' sia.

    in Dialogo crea sotto public: QString riga() const { return ui->lineEdit->text();}

    nella riga appena sotto mioDialogo.exec(); ti basta chamare mioDialogo.riga() per leggere il testo


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.