在Qt应用程序中呈现capsule-style toolbar controls(包括按钮下方的标签文本)的最佳方法是什么?
就渲染按钮而言,我想尽可能地利用Mac OS提供的内容。 (我不是Mac开发人员,所以不知道它是否有这方面的API。)也就是说,我知道我可以自己绘制它们,使用样式表进行边框图像,猜测字体,并将其全部设置在布局中,但是当Mac更新她的“外观和感觉”时,是否有更好的方法确保一致的演示?我在Qt中使用C ++。
我不讨厌使用Q_WS_MAC来获取特定于平台的渲染,但是Qt已经有了这方面的任何东西吗?你知道,某处有setCapsuleStyle(true)
方法吗? :)
感谢您的任何建议。
答案 0 :(得分:3)
qt-labs存储库中有一个分段按钮示例,在KDE上看起来很不错。它有相当数量的#ifdef Q_WS_MAC
代码,但我不知道它在Mac上呈现的效果如何。你可以找到它here。
如果您专门定位Mac,则可以使用QMacCocoaViewContainer呈现原生细分按钮。它的学习曲线相当陡峭,所以你可能会发现这篇关于Mac小部件的Qt Labs博客文章有趣:Mac widget style addons。作者提供了三种Mac风格的小部件:QtCocoaPushButton,QtCocoaComboBox和QtCocoaSegmentedButton。
答案 1 :(得分:1)
由于Qt本身不提供这种类型的小部件,最好的方法是继承QPushButton并重新实现paintEvent
。然后,您可以通过简单地绘制包含胶囊按钮屏幕截图的QPixmap来绘制胶囊像素图。您可以通过重新实现mousePressEvent
和mouseReleaseEvent
来添加点击行为。
// 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/
也许这有帮助。
答案 2 :(得分:0)
我过去做过类似的事情。不幸的是,我没有与我分享其源代码。然而,最安全的赌注是使用Qt Style sheets。它们支持各种属性,伪状态和子控件,可以自定义外观。