【问题标题】:QComboBox fused to QSpinBoxQComboBox 融合到 QSpinBox
【发布时间】:2011-09-28 10:42:49
【问题描述】:

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

我已经尝试使用样式表进行此操作,但执行此操作时会丢失 plastique 样式。

什么是[最好是非笨拙的]方法来做到这一点?

谢谢,

安德烈亚斯

【问题讨论】:

标签: c++ user-interface qt4 usability


【解决方案1】:

如果 fused 的意思是 spinbox 和 combobox 之间的距离应该为零,那么您应该创建 QProxyStyle 后代,如果要求 QStyle::PM_LayoutHorizontalSpacing,则重新实现 styleHint 以返回 -1,并声明一个名为 layoutSpacingImplementation 的插槽(阅读 @987654321 @) 接收这两种小部件类型(表示它们是枚举)。

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 后代,这将使您的旋转框部分覆盖组合框(准确地说是覆盖左圆边缘部分),这样会产生融合的错觉。但是,如果用户使用组合框边缘较宽的样式,这可能看起来很难看,这将在 sing 框的一侧“向外看”。这是一种快速而丑陋的解决方法。

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

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 2019-11-03
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多