Questa 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.







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?
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
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
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
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!!!!
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
complimenti per la guida!
ci voleva proprio, non vedevo l ora di usare le QT