【问题标题】: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 来绘制胶囊像素图。您可以通过重新实现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/
也许有帮助。
【解决方案3】:
我过去做过类似的事情。不幸的是,我没有它的源代码与您分享。然而最安全的选择是使用Qt Style sheets。它们支持各种属性、伪状态和子控件,使自定义外观成为可能。