看了《C++ Gui Programming With Qt 4 2nd》第六章"布局管理器"的第三節"Splitters", 并且做了里面的例子, 感覺怎么跟書里面的圖像很不相同. 特別是那些分界線, 存在是存在, 但是跟背景一模一樣, 書上也沒說明怎么處理分界線(可能后面有講,這個我就不清楚了).
QSplitter * mainSplitter = new QSplitter(Qt::Horizontal);
QLabel *label = new QLabel(QObject::tr("A"));
QLabel *label2 = new QLabel(QObject::tr("B"));
mainSplitter->addWidget(label2);
mainSplitter->addWidget(label);
mainSplitter->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
mainSplitter->show();
在main方法里面寫上上述代碼, 運行后(注意看分界線, 看不到吧):
書里面是:
分界線方面的差距挺大的呢? 我查了一下, 原來是一條分界線是一個QSplitterHandle 類對象. 通過下面的一些代碼, 我們可以統一修改分界線的樣式.
mainSplitter->setStyleSheet("QSplitter::handle { background-color: black }"); //設置分界線的樣式
mainSplitter->setHandleWidth(20); //設置分界線的寬度
加了上述兩行代碼后的效果如下:
分界線的背景顏色變為"黑色", 并且寬度變得很大, 看來上述代碼是起到作用了. 如果有很多條分界線, 我們希望只修改第一條的分界線, 怎么辦呢? 請看下面的一行代碼:
QSplitterHandle *handle = mainSplitter->handle(1); //注意不是從0 索引開始, 如果找不到分界線, 將返回NULL.
通過上述代碼, 我們可以取得B 和 A 之間的分界線. 值得注意的是, mainSplitter->handle(0) 是存在的, 但是無法對其進行處理. 為了驗證我們是否真的獲取B 和 A 之間的分界線的對象指針, 我們寫上下面的代碼:
if(handle)
{
handle->setFixedWidth(1);
}
效果如下:
我們把B 和 A 之間的分界線的寬度修改為1了. 如果你想讓分界線失去拖動的功能, 你可以寫上 handle->setDisabled(true); 使其無效. 上面的分界線明顯偏向了B 那邊, 并且離A 有點距離, 看來要做得完善點, 還要耗點功夫才行呢!
對于B 和 A 來說, 他們的本身的大小相對于整個窗口來說, 都是很小的. 這樣就存在著一些多余的空間, 這些空間可以給B, 也可以給A, 或者兩個平分. 對于B 和 A 各自空間大小的控制, 是通過 QSplitter 的 setStretchFactor 方法, 該方法的聲明:
void setStretchFactor(int index, int stretch);
第一個參數index 是子微件的索引值, 從0 開始. 這里的話, B 是0, A 是1; 第二個參數 stretch 是拉伸系數, int 類型, 下面主要對stretch 的數值進行說明.
1. mainSplitter->setStretchFactor(0, -2);
效果如下,
B占據了所有多余的空間, 看來 stretch 的值如果為負整數, 那這個微件將占據最大的空間.
2. mainSplitter->setStretchFactor(0, -2);
mainSplitter->setStretchFactor(1, -4);
效果如下:
B 和 A 平分了空間, 看來stretch 如果是負整數就會盡可能的占據空間, 而不看負整數的大小, 把 -2 改為 -12, 結果一樣的.
3. mainSplitter->setStretchFactor(0, 0);
mainSplitter->setStretchFactor(1, 0);
效果同第二.
4. mainSplitter->setStretchFactor(0, 0); //可以把這段注釋掉, 效果一樣
mainSplitter->setStretchFactor(1, 1);
效果如下:
5. mainSplitter->setStretchFactor(0, 4);
mainSplitter->setStretchFactor(1, 8);
效果如下:
6. mainSplitter->setStretchFactor(0, -4);
mainSplitter->setStretchFactor(1, 8);
效果如下,
從 1, 2 和 6 的測試效果可以看出, 拉伸系數為負整數的微件將占據最大的多余空間.
從3, 4 和 5 的測試效果來看, 就算我們不設置 B 或 A 的拉伸系數stretch, 他們內部也應該存在著一個默認拉伸系數值0. stretch為 0 的微件, 將把最大多余空間讓給stretch 為正整數的微件. 如果有
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
