所以我正在为一些科学软件编写一个Qt GUI,我有QSpinBoxes和QDoubleSpinBoxes用于用户应该设置单位的数量。因为我连续有几个这样的spinbox-combobox对,所以我认为让右侧的ComboBox与左侧的SpinBox融合起来是最不容易的。
我尝试使用样式表,但是当我这样做时,我正在失去塑造风格。
这样做的方法是什么?[最好是非kludgy]?
谢谢,
安德烈亚斯
答案 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中的简单图形效果,我想说这不值得付出努力。