在Qt中创建胶囊式工具栏控件

问题描述 投票:4回答:3

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

至于渲染按钮,我想尽可能地利用Mac OS提供的内容。 (我不是Mac开发人员,所以不知道它是否有这方面的API。)也就是说,我知道我可以自己绘制它们,使用样式表进行边框图像,猜测字体,并将其全部设置在布局中,但是当Mac更新她的“外观和感觉”时,是否有更好的方法确保一致的演示?我在Qt中使用C ++。

我不讨厌使用Q_WS_MAC来获取特定于平台的渲染,但是Qt已经有了这个吗?你知道吗,某处的setCapsuleStyle(true)方法? :)

谢谢你的任何建议。

macos qt user-interface toolbar
3个回答
3
投票

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

如果您专门定位Mac,则可以使用QMacCocoaViewContainer渲染本机分段按钮。它的学习曲线相当陡峭,所以你可能会发现这篇关于Mac小部件的Qt Labs博客文章有趣:Mac widget style addons。作者提供了三种Mac风格的小部件:QtCocoaPushButton,QtCocoaComboBox和QtCocoaSegmentedButton。


1
投票

由于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();
}

我写了一个关于如何创建自定义小部件的简短教程:qazxsw poi

也许这有帮助。


0
投票

我过去做过类似的事情。不幸的是,我没有与我分享其源代码。然而,最安全的赌注是使用http://www.serenethinking.com/2010/08/how-to-create-custom-widgets-with-qt/。它们支持各种属性,伪状态和子控件,可以自定义任何扩展的外观。

© www.soinside.com 2019 - 2024. All rights reserved.