qtQuesta lezione vuole essere un semplice avvicinamento al meccanismo di layout management di Qt. Trattandosi di un primo esempio di layout management ho preferito affrontarlo tramite il Qt Designer, in modo da vederne in pratica il suo funzionamento ancora prima di apprendere la sua programmazione. Voglio inoltre nel frattempo rassicurare tutti coloro che attendono la seconda parte della lezione 4 (custom widget plugin): la lezione è in corso di preparazione, trattandosi di un argomento complesso ci vuole un po’ di tempo per spiegarlo bene.

La lezione può essere scaricata in formato PDF qui, il form di esempio può essere scaricato qui.

  • Share/Bookmark
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
7 Responses
  1. Emanuele says:

    Ciao, prima di tutto complimenti per il blog e per gli ottimi tutorial sul Qt!!
    Ti scrivo a proposito della Qt per porti un problema. Ho intenzione di mettere un volume Slider di Phonon in un horizzontal box (chiamato volumeLayout) nella main window di un mio piccolo programma per sentire radio online.

    Il volume Slider lo creo facilmente così:

    volumeSlider = new Phonon::VolumeSlider(this);
    volumeSlider->setAudioOutput(audioOutput);
    volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);

    però se vado ad aggiungere in MainWindow

    volumeLayout.addWidget(volumeSlider);

    mi mette il volumeSlider sovrappononendolo alla menu bar (ossia alla scritta File). Sembra come non prenda il widget volumeSlider all’ interno del volumeLayout visto che il volumeSlider pur non mettendo il volumeLayout me lo mette sempre all’ altezza della menu bar.

    Come posso risolvere?

  2. admin says:

    Ciao Emanuele,
    solo una cosa prima di tuto: ti serve proprio una main window? Non ti basterebbe un QDialog?
    Se la QMainWindow ti serve probabilmente perchè ti serve la menu bar) allora avrei bisogno di capire volumeLayout come è stato creato, cioè se è figlio della main window se è il central widget etc…
    Il fatto che ti metta il widget sopra la scritta file mi lascia immaginare che manchi qualcosa a livello di laouy management generale.
    Fammi sapere o se ti va, invia un pezzo del tuo codice dove creti il layout e inserisci i vari componenti al suo interno.
    ciao

  3. Emanuele says:

    Lo scopo è quello di creare una finestra con dei pulsanti ognuno collegato ad una radio in streaming, un pulsante di stop, una menu bar e un volume slider che voglio mettere in basso a sinistra ma invece è sempre in alto a destra sopra la scritta file.

    Ho realizzato il tutto con qtcreator, questo è il file della UI:


    /********************************************************************************
    ** Form generated from reading ui file 'mainwindow.ui'
    **
    ** Created: Sun Jun 28 16:20:58 2009
    ** by: Qt User Interface Compiler version 4.5.1
    **
    ** WARNING! All changes made in this file will be lost when recompiling ui file!
    ********************************************************************************/

    #ifndef UI_MAINWINDOW_H
    #define UI_MAINWINDOW_H

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include

    QT_BEGIN_NAMESPACE

    class Ui_MainWindowClass
    {
    public:
    QAction *actionExit;
    QWidget *centralWidget;
    QWidget *widget;
    QPushButton *pushButton;
    QPushButton *pushButton_2;
    QPushButton *pushButton_3;
    QPushButton *pushButton_4;
    QPushButton *pushButton_5;
    QPushButton *pushButton_6;
    QWidget *horizontalLayoutWidget;
    QHBoxLayout *volumeLayout;
    QToolBar *mainToolBar;
    QStatusBar *statusBar;
    QMenuBar *menuBar;
    QMenu *menuFile;

    void setupUi(QMainWindow *MainWindowClass)
    {
    if (MainWindowClass->objectName().isEmpty())
    MainWindowClass->setObjectName(QString::fromUtf8("MainWindowClass"));
    MainWindowClass->resize(600, 450);
    actionExit = new QAction(MainWindowClass);
    actionExit->setObjectName(QString::fromUtf8("actionExit"));
    centralWidget = new QWidget(MainWindowClass);
    centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
    widget = new QWidget(centralWidget);
    widget->setObjectName(QString::fromUtf8("widget"));
    widget->setGeometry(QRect(10, 10, 521, 141));
    pushButton = new QPushButton(widget);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(10, 10, 106, 27));
    pushButton_2 = new QPushButton(widget);
    pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
    pushButton_2->setGeometry(QRect(350, 10, 85, 27));
    pushButton_3 = new QPushButton(widget);
    pushButton_3->setObjectName(QString::fromUtf8("pushButton_3"));
    pushButton_3->setGeometry(QRect(140, 90, 131, 31));
    pushButton_4 = new QPushButton(widget);
    pushButton_4->setObjectName(QString::fromUtf8("pushButton_4"));
    pushButton_4->setGeometry(QRect(160, 10, 106, 27));
    pushButton_5 = new QPushButton(widget);
    pushButton_5->setObjectName(QString::fromUtf8("pushButton_5"));
    pushButton_5->setGeometry(QRect(160, 50, 106, 27));
    pushButton_6 = new QPushButton(widget);
    pushButton_6->setObjectName(QString::fromUtf8("pushButton_6"));
    pushButton_6->setGeometry(QRect(10, 90, 106, 27));
    horizontalLayoutWidget = new QWidget(centralWidget);
    horizontalLayoutWidget->setObjectName(QString::fromUtf8("horizontalLayoutWidget"));
    horizontalLayoutWidget->setGeometry(QRect(340, 250, 160, 80));
    volumeLayout = new QHBoxLayout(horizontalLayoutWidget);
    volumeLayout->setSpacing(6);
    volumeLayout->setMargin(11);
    volumeLayout->setObjectName(QString::fromUtf8("volumeLayout"));
    volumeLayout->setContentsMargins(0, 0, 0, 0);
    MainWindowClass->setCentralWidget(centralWidget);
    mainToolBar = new QToolBar(MainWindowClass);
    mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
    MainWindowClass->addToolBar(Qt::TopToolBarArea, mainToolBar);
    statusBar = new QStatusBar(MainWindowClass);
    statusBar->setObjectName(QString::fromUtf8("statusBar"));
    MainWindowClass->setStatusBar(statusBar);
    menuBar = new QMenuBar(MainWindowClass);
    menuBar->setObjectName(QString::fromUtf8("menuBar"));
    menuBar->setGeometry(QRect(0, 0, 600, 24));
    menuFile = new QMenu(menuBar);
    menuFile->setObjectName(QString::fromUtf8("menuFile"));
    MainWindowClass->setMenuBar(menuBar);

    menuBar->addAction(menuFile->menuAction());
    menuFile->addAction(actionExit);

    retranslateUi(MainWindowClass);

    QMetaObject::connectSlotsByName(MainWindowClass);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindowClass)
    {
    MainWindowClass->setWindowTitle(QApplication::translate("MainWindowClass", "Radiolina", 0, QApplication::UnicodeUTF8));
    actionExit->setText(QApplication::translate("MainWindowClass", "Exit", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("MainWindowClass", "Radio Capital", 0, QApplication::UnicodeUTF8));
    pushButton_2->setText(QApplication::translate("MainWindowClass", "Stop", 0, QApplication::UnicodeUTF8));
    pushButton_3->setText(QApplication::translate("MainWindowClass", "Virgin Rock Classic", 0, QApplication::UnicodeUTF8));
    pushButton_4->setText(QApplication::translate("MainWindowClass", "RadioUno", 0, QApplication::UnicodeUTF8));
    pushButton_5->setText(QApplication::translate("MainWindowClass", "Virgin Classic", 0, QApplication::UnicodeUTF8));
    pushButton_6->setText(QApplication::translate("MainWindowClass", "RadioTre", 0, QApplication::UnicodeUTF8));
    menuFile->setTitle(QApplication::translate("MainWindowClass", "File", 0, QApplication::UnicodeUTF8));
    } // retranslateUi

    };

    namespace Ui {
    class MainWindowClass: public Ui_MainWindowClass {};
    } // namespace Ui

    QT_END_NAMESPACE

    #endif // UI_MAINWINDOW_H

    PS non è che devo creare una sorta di custom widget contenente il volumeSlider di Phonon per darlo così in pasto a qtcreator (ovvero qtdesigner)???

    Grazie mille

  4. admin says:

    Ciao Emanuale,
    c’è qualche problema di layout management. Mi vengono inmente due cose:
    con il tuo layout dei pulsanti selezionato hai fatto click col mouse sulla main window tenendo premuto il tasto ctrl e dopo hai messo in un layout a griglia?
    il central widget è definito e il tuo layout è figlio del centraql widget che è figlio della main window. Pare tutto ok, ma c’è una sovrapposizione che non mi spiego.
    Ti allego una prova che ho fatto per farti un esempio di come lo farei io, probabilmente manca qualche azione del menu e non so se i bottoni sono quelli giusti e in numero giusto, ma ti dà un’idea di come fare il tutto usando gli spaziatori, il layout orizzontale, quello a griglia e i vari pulsanti, slider etc…
    se hai ancora problemi mandami il tuo file ui.

    il file di prova che ho fatto io lo trovi su
    http://www.sereno-online.com/uploads/mainwindow.ui

  5. emanuele says:

    Problema Risolto!!!!

    Allora, ho rifatto la struttura cosi come me l’ hai suggerita. Poi ho evitato di creare l’oggetto volume slider di phonon ma ho sfruttato lo QSlider messo con qtdesigner. Ho inserito nel mainwindow.cpp questo codice


    void MainWindow::on_volume_valueChanged(int volume)
    {
    audioOutput->setVolume(volume/100.0f);
    }

    e adesso lo slider volume mi controlla perfettamente il livello del volume dell' audioOutput di Phonon!!!

    Grazie mille!!!!

  6. admin says:

    Bene, sono contento che funzioni.
    Allora buon ascolto e magari, se ti va, puoi mettere la tua applicazione a disposizione di tutti (ad esempio su qt-apps.com).

    Saluti
    paolo

  7. ophys says:

    complimenti per la guida!
    ci voleva proprio, non vedevo l ora di usare le QT

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Spam Protection by WP-SpamFree