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, sottoprivate:
Q_SLOT void mostraDialogo(){ Dialogo mioDialogo(this); mioDialogo.exec(); }
ora nel costruttore di
MainWindow
aggiungiQTimer::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; }
-
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