開發(fā)一個圖形界面應(yīng)用程序,界面的布局影響到界面的美觀。在設(shè)計一個界面之前,應(yīng)該考慮到開發(fā)的界面可能給不用的用戶使用,而用戶的屏幕大小、縱橫比例、分辨率可能不同,界面還可能是可縮放的,程序應(yīng)該可以適應(yīng)這些變化。
???????前面的程序中都是使用setGeometry()方法定位控件的位置,這個方法比較笨拙。試想如果控件很多,布局這些控件需要編寫大量的代碼。幸運的是,QT提供了更好的方法布局控件。
???????常用的三種布局方法:
(1)使用水平布局類QHBoxLayout;
(2)使用垂直布局類QVBoxLayout;
(3)使用網(wǎng)格布局類QGridLayout。
這三種方法可以嵌套使用。
?
控件在布局時可以先不指定父窗口,最后交由Layout統(tǒng)一指定。
?
示例:
1.??
#include <QApplication> #include <QDialog> #include <QPushButton> #include <QLineEdit> #include <QLayout> #include <QLabel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDialog *mainWindow = new QDialog; QHBoxLayout *topLayout = new QHBoxLayout; QLabel *lbl = new QLabel(QWidget::tr("&Input:"), mainWindow); QLineEdit *lineEdt = new QLineEdit(mainWindow); lbl->setBuddy(lineEdt); topLayout->addWidget(lbl); topLayout->addWidget(lineEdt); QHBoxLayout *bomLayout = new QHBoxLayout; QPushButton *btn_ok = new QPushButton(QWidget::tr("OK"), mainWindow);\ btn_ok->setDefault(true); QPushButton *btn_cancel = new QPushButton(QWidget::tr("Cancel"), mainWindow); bomLayout->addStretch(); bomLayout->addWidget(btn_ok); bomLayout->addStretch(); bomLayout->addWidget(btn_cancel); bomLayout->addStretch(); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(topLayout); mainLayout->addLayout(bomLayout); mainWindow->setLayout(mainLayout); mainWindow->resize(300, 100); mainWindow->setWindowTitle(QWidget::tr("Qt Test")); mainWindow->show(); return a.exec(); }
編譯運行,界面如下:
?
在界面中,最外部是mainLayout,它的類型是垂直布局類QVBoxLayout。它包含了兩個水平布局類QHBoxLayout,分別是topLayout和bomLayout。
?
比起QHBoxLayout和HVBoxLayout, QGridLayout運用更加靈活。
QGridLayout的常用方法
(1)addWidget:
?
1.??//放置一個控件到一個單元格??
2.??void????addWidget?(?QWidget?*?widget,?int?row,?int?column,?Qt::Alignment?alignment?=?0?)??
3.??//如果放置的控件超出一個單元格,則使用該方法??
4.??void????addWidget?(?QWidget?*?widget,?int?fromRow,?int?fromColumn,?int?rowSpan,?int?columnSpan,?Qt::Alignment?alignment?=?0?)??
??? 1)row:指放置控件的網(wǎng)格行號(行號從0開始);
??? 2)colum:指放置控件的網(wǎng)格列號(從0開始);
??? 3)alignment:對齊方式。
??? 4)fromRow:指放置控件的起始網(wǎng)格行號;
??? 5)fromColumn:指放置控件的起始網(wǎng)格列號;
??? 6)rowSpan:指放置控件占多少行;
??? 7)columnSpan:指放置控件占多少列。
(2)addLayout
?
1.??void????addLayout?(?QLayout?*?layout,?int?row,?int?column,?Qt::Alignment?alignment?=?0?)??
2.??void????addLayout?(?QLayout?*?layout,?int?row,?int?column,?int?rowSpan,?int?columnSpan,?Qt::Alignment?alignment?=?0?)??
參數(shù)與addWidget類似。
(3)setSpacing
?
1.??void?QGridLayout::setSpacing?(?int?spacing?)??
設(shè)置控件水平和垂直之間的間隔。
示例:
#include <QApplication> #include <QDialog> #include <QPushButton> #include <QLineEdit> #include <QLayout> #include <QLabel> #include <QTextEdit> int main(int argc, char *argv[]) { QApplication a(argc, argv); QDialog *mainWindow = new QDialog; QGridLayout *gridLayout = new QGridLayout; gridLayout->setColumnStretch(0, 1); gridLayout->setColumnStretch(1, 4); gridLayout->setColumnStretch(2, 1); gridLayout->setColumnStretch(3, 1); gridLayout->setColumnStretch(4, 4); gridLayout->setMargin(15); gridLayout->setColumnMinimumWidth(2, 15); QLabel *lbl1 = new QLabel(QWidget::tr("First Name:")); QLineEdit *edit1 = new QLineEdit; QLabel *lbl2 = new QLabel(QWidget::tr("Last Name:")); QLineEdit *edit2 = new QLineEdit; QLabel *lbl3 = new QLabel(QWidget::tr("Sex:")); QLineEdit *edit3 = new QLineEdit; QLabel *lbl4 = new QLabel(QWidget::tr("Birthday:")); QLineEdit *edit4 = new QLineEdit; QLabel *lbl5 = new QLabel(QWidget::tr("Address:")); QTextEdit *textEdt = new QTextEdit; gridLayout->addWidget(lbl1, 0, 0); gridLayout->addWidget(edit1, 0, 1); gridLayout->addWidget(lbl2, 0, 3); gridLayout->addWidget(edit2, 0, 4); gridLayout->addWidget(lbl3, 1, 0); gridLayout->addWidget(edit3, 1, 1); gridLayout->addWidget(lbl4, 1, 3); gridLayout->addWidget(edit4, 1, 4); gridLayout->addWidget(lbl5, 2, 0); gridLayout->addWidget(textEdt, 3, 0, 2, 5); mainWindow->setLayout(gridLayout); mainWindow->resize(400, 150); mainWindow->setWindowTitle(QWidget::tr("Qt Test")); mainWindow->show(); return a.exec(); }
?
編譯運行,界面如圖:
?
?
總結(jié)
以上是生活随笔為你收集整理的Qt 布局(水平、垂直、网格)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。