2010-08-31 28 views
4

在Qt应用程序中渲染capsule-style toolbar controls(包括按钮下方的标签文本)的最佳方式是什么?在Qt中创建胶囊式工具栏控件

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

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

感谢您的任何建议。

回答

3

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

如果您仅针对Mac,则可以使用QMacCocoaViewContainer来呈现原生分段按钮。它的学习曲线非常陡峭,所以你可能会发现这个Qt实验室博客文章关于Mac小部件有趣: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(); 
} 

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

也许没有什么帮助。

0

我在过去做过类似的事情。不幸的是,我没有与我分享的源代码。但最安全的方法是使用Qt Style sheets。它们支持各种属性,伪状态和子控件,从而可以在任何扩展中自定义外观。