2011-09-28 32 views
2

因此,我正在爲一些科學軟件編寫一個Qt GUI,並且我有QSpinBoxes和QDoubleSpinBoxes以供用戶設置單位的數量。因爲我連續有幾個這樣的spinbox-combobox對,所以我認爲將右邊的ComboBox融合到左邊的SpinBox上會是最不困惑的。與QSpinBox融合的QComboBox

我試圖用樣式表,但當我這樣做時,我失去了plastique樣式。

什麼將是一個[最好是non-kludgy]的方式來做到這一點?

感謝,

安德烈亞斯

+0

下面是我想到的一個模型:http://pointfree.net/.other/fused.png – andreasw

+0

我對這樣的課程感興趣。你有沒有實施這個,可以分享嗎? – dhaumann

回答

2

如果融合你的意思是紡紗器和組合框之間的距離應該是零,那麼您應該創建QProxyStyle後裔,重新實現styleHint返回-1,如果要求QStyle::PM_LayoutHorizontalSpacing和declarie一個名爲layoutSpacingImplementation(閱讀QStyle documentation)的插槽接收這兩種控件類型(表示它們的枚舉)。

MyClass::layoutSpacingImplementation(QSizePolicy::ControlType control1, 
             SizePolicy::ControlType control2, 
             Qt::Orientation orientation, 
             const QStyleOption * option = 0, 
             const QWidget * widget = 0) const 
{ 
    if (orientation == Qt::Horizontal && 
     ((control1 == QSizePolicy::SpinBox && control2 == QSizePolicy::ComboBox) || 
     (control2 == QSizePolicy::SpinBox && control1 == QSizePolicy::ComboBox))) 
       return 0; 

    int spacing = baseStyle()->styleHint(QStyle::PM_LayoutHorizontalSpacing); 
    if (spacing >= 0) return spacing; 
    return baseStyle()->layoutSpacing(control1, control2, orientation, option, widget); 
} 

然後,設置這種風格的小部件的融合項目躺在,使用它以前的風格爲基本樣式。

這將把所有這些元素融合在一起,所以如果在不應該融合的元素之間添加一些額外的空間將是最好的。這是一個小問題,但不幸的是,文檔沒有說明哪個控件描述了左或右控制(我猜這意味着空間應該是獨立排序的),所以沒有其他方法可以實現它。

編輯:

剛剛看到張貼的圖像。標準qt沒有這樣的控制,通過典型手段實現它是不太可能的。您可能會嘗試創建自己的佈局類或您自己的QWidget後代,這會讓您的紡紗箱部分覆蓋組合框(精確地覆蓋左圓邊部分),從而創建融合假象。然而,如果用戶使用組合框邊緣更寬的樣式,這可能看起來很難看,這將會在Sping Box的側面「向外看」。這是一個快速和經驗豐富的解決方法。

除此之外,我認爲唯一的選擇是創建自己的小部件 - 但即使使用QStyle中的繪畫函數(大多是drawControl,我猜)和代碼碎片實現單獨的QSpingBox和QCombobox,這將意味着大量和大量的工作。考慮到你想在UI中實現簡單的圖形效果,我會說這是不值得的。