QComboBox融合到QSpinBox

时间:2011-09-28 00:42:55

标签: c++ user-interface qt4 usability

所以我正在为一些科学软件编写一个Qt GUI,我有QSpinBoxes和QDoubleSpinBoxes用于用户应该设置单位的数量。因为我连续有几个这样的spinbox-combobox对,所以我认为让右侧的ComboBox与左侧的SpinBox融合起来是最不容易的。

我尝试使用样式表,但是当我这样做时,我正在失去塑造风格。

这样做的方法是什么?[最好是非kludgy]?

谢谢,

安德烈亚斯

1 个答案:

答案 0 :(得分:2)

如果通过融合表示spinbox和combobox之间的距离应为零,则应创建QProxyStyle后代,如果要求QStyle::PM_LayoutHorizontalSpacing,则重新实现styleHint返回-1,并声明一个名为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后代,这将使您的spinbox部分覆盖组合框(确切地覆盖左圆边部分),这样可以创建融合的幻觉。然而,如果用户使用具有更宽边缘的组合框的样式,这可能看起来很丑陋,这将在外观框的侧面“向外看”。这是一个快速而又狡猾的丑陋解决方法。

除此之外,我认为你唯一的选择就是创建自己的小部件 - 但是即使使用QStyle的绘画功能(我估计也是drawControl)和实现单独的QSpingBox和QCombobox的代码片段,这将意味着大量的工作。考虑到你想要实现的是UI中的简单图形效果,我想说这不值得付出努力。