1. 程式人生 > >8.布局管理器

8.布局管理器

布局 min spi form loaded function scroll resolve dde

1.新組件:
①QSpinBox 只能輸入數字的輸入框,並且帶有上下箭頭的步進按鈕
②QSlider 帶有滑塊的滑桿
③這兩個組件的連接
 QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
1 1
 QObject::connect(slider, &QSlider::valueChanged, spinBox, &QSpinBox::setValue);
很容易就能看明白這個連接的過程
但是如果這麽寫從spinBox到slider的過程就會報錯
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
no matching function for call to ‘QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))‘
2 1
QObject::connect(spinBox, &QSpinBox::valueChanged, slider, &QSlider::setValue);
2
no matching function for call to ‘QObject::connect(QSpinBox*&, <unresolved overloaded function type>, QSlider*&, void (QAbstractSlider::*)(int))‘

為何會出現這個錯誤,我們來仔細看看&QSpinBox::valueChanged這個函數

QSpinBox

的文檔發現,QSpinBox的確有兩個信號:

  • void valueChanged(int)
  • void valueChanged(const QString &)

那麽在調用這個函數的時候就會因為二義性而報錯了。解決方法也很簡單,在調用之前顯示的指定一個函數。方法就是,我們創建一個函數指針,這個函數指針參數指定為 int:
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
然後我們將這個函數指針作為 signal,與 QSlider 的函數連接:
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);
1 1
void (QSpinBox:: *spinBoxSignal)(int) = &QSpinBox::valueChanged;
2
然後我們將這個函數指針作為 signal,與 QSlider 的函數連接:
3
QObject::connect(spinBox, spinBoxSignal, slider, &QSlider::setValue);



2.下面的代碼,我們創建了一個QHBoxLayout對象。顯然,這就是一個布局管理器。然後將這兩個組件都添加到這個布局管理器,並且把該布局管理器設置為窗口的布局管理器。這些代碼看起來都是順理成章的,應該很容易明白。並且,布局管理器很聰明地做出了正確的行為:保持QSpinBox寬度不變,自動拉伸QSlider的寬度。


Qt 提供了幾種布局管理器供我們選擇:

  • QHBoxLayout:按照水平方向從左到右布局;
  • QVBoxLayout:按照豎直方向從上到下布局;
  • QGridLayout:在一個網格中進行布局,類似於 HTML 的 table;
  • QFormLayout:按照表格布局,每一行前面是一段文本,文本後面跟隨一個組件(通常是輸入框),類似 HTML 的 form;
  • QStackedLayout:層疊的布局,允許我們將幾個組件按照 Z 軸方向堆疊,可以形成向導那種一頁一頁的效果。

  • 來源: https://www.devbean.net/2012/09/qt-study-road-2-layout/

8.布局管理器