【问题标题】:Create capsule-style toolbar controls in Qt在 Qt 中创建胶囊式工具栏控件
【发布时间】:2011-04-06 07:56:41
【问题描述】:

在 Qt 应用程序中呈现capsule-style toolbar controls(包括按钮下方的标签文本)的最佳方式是什么?

就渲染按钮而言,我想尽可能地利用 Mac OS 提供的功能。 (我不是Mac开发人员,所以不知道它是否有API。)也就是说,我知道我可以自己绘制它们,使用样式表作为边框图像,猜测字体,然后全部设置在布局中,但是当 Mac 更新她的“外观和感觉”时,是否有更好的方法来确保一致的呈现?我在 Qt 中使用 C++。

我不讨厌使用 Q_WS_MAC 来获得特定于平台的渲染的想法,但是 Qt 是否已经为此提供了任何东西?你知道,在某处有一个setCapsuleStyle(true) 方法吗? :)

感谢您的任何建议。

【问题讨论】:

    标签: macos qt user-interface toolbar


    【解决方案1】:

    在 qt-labs 存储库中有一个分段按钮示例,在 KDE 上看起来不错。它有相当多的#ifdef Q_WS_MAC 代码,但我不知道它在 Mac 上的渲染效果如何。你可以找到它here

    如果您专门针对 Mac,您可以使用 QMacCocoaViewContainer 来呈现原生分段按钮。它的学习曲线非常陡峭,因此您可能会发现这篇关于 Mac 小部件的 Qt Labs 博客文章很有趣:Mac widget style addons。作者提供了三个 Mac 风格的小部件:QtCocoaPushButton、QtCocoaComboBox 和 QtCocoaSegmentedButton。

    【讨论】:

      【解决方案2】:

      由于 Qt 本身不提供这种类型的小部件,因此最好的方法是继承 QPushButton 并重新实现 paintEvent。然后,您可以通过简单地绘制包含胶囊按钮屏幕截图的 QPixmap 来绘制胶囊像素图。您可以通过重新实现mousePressEventmouseReleaseEvent 来添加点击行为。

      // CapsuleButton.h
      class CapsuleButton : public QPushPutton {
         // ...
      protected:
         void paintEvent(QPaintEvent*);
         void mousePressEvent(QMouseEvent*);
         void mouseReleaseEvent(QMouseEvent*);
         // ...
      private:
         QPixmap pixmap_;
         QPixmap pressedPixmap_;
         bool pressed_;
      };
      
      // CapsuleButton.cpp
      CapsuleButton::CapsuleButton(QObject* parent) : 
          QPushButton(parent),
          pixmap_(":/capsule-button-background.png"),
          pressedPixmap_(":/capsule-button-background-pressed.png"),
          pressed_(false)
      { /*...*/ }
      
      void CapsuleButton::paintEvent(QPaintEvent *)
      {
          QPainter painter(this);
          painter.drawPixmap(rect(), pressed_? pressedPixmap_ : pixmap_);
      }
      
      void CapsuleButton::mousePressEvent(QMouseEvent* event)
      {
          if (event->button() == Qt::LeftButton)
             pressed_ = true;
          update();
      }
      
      void CapsuleButton::mouseReleaseEvent(QMouseEvent*)
      {
          pressed_ = false;
          update();
      }
      

      我写了一个关于如何创建自定义小部件的简短教程:http://www.serenethinking.com/2010/08/how-to-create-custom-widgets-with-qt/

      也许有帮助。

      【讨论】:

        【解决方案3】:

        我过去做过类似的事情。不幸的是,我没有它的源代码与您分享。然而最安全的选择是使用Qt Style sheets。它们支持各种属性、伪状态和子控件,使自定义外观成为可能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-03
          • 2014-01-03
          • 2012-01-25
          • 2010-10-21
          • 2015-07-08
          • 1970-01-01
          • 2014-03-04
          • 1970-01-01
          相关资源
          最近更新 更多