因此,我正在为某些科学软件编写Qt GUI,并且具有QSpinBoxes和QDoubleSpinBoxes用于用户应设置单位的数量。因为我连续有几对这些spinbox-combobox对,所以我认为将右侧的ComboBox与左侧的SpinBox融合在一起会带来最少的困惑。

我已经尝试过使用样式表进行此操作,但是当我这样做时,我正在丢失塑质样式。

做这件事的[最好是非浮躁]方法是什么?

谢谢,

安德烈亚斯

最佳答案

如果通过融合表示旋转框和组合框之间的距离应为零,则应创建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部分覆盖combobox(准确地覆盖左圆角部分),从而产生融合的幻觉。但是,如果用户使用组合框边缘较宽的样式(看起来会在弹出框的侧面看),这可能很难看。这是一种快捷而又丑陋的解决方法。

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

10-06 11:35