如何在Qt中绘制关闭、最小化和最大化按钮?

5

我创建了一个 this->setWindowFlags(Qt::FramelessWindowHint); ,因此没有标题栏。 因此,我正在实现自己的标题栏。 在继续之前,我想知道是否有一种标准方法以本地操作系统外观方式添加关闭、最小化和最大化按钮(例如,在Windows上,它应该看起来像Windows关闭按钮,OS X和Linux也是如此)。


1
你已经通过使用无边框窗口来消除获取本地外观按钮的选项。在Qt中没有绘制它们的功能,你必须自己绘制它们。通常情况下,当你这样做时,不要让它们看起来像本地按钮。 - Hans Passant
@HansPassant 我想创建一个像Chrome一样的选项卡系统。但是,就像Chrome一样,我希望按钮看起来与操作系统本地化。 - chacham15
啊,是的,当你有150名程序员在一个产品上工作时,你可以做很多好事。 - Hans Passant
至少在Mac OS X上,Google Chrome实际上是移动标准窗口控件,而不是省略它们。 (它以完全非便携式、特定于操作系统的方式执行此操作。) - user149341
1个回答

7

QStyle基于操作系统的样式提供了很多标准图标。您可以从当前操作系统样式中获取此图标,然后自己绘制。

这是一个简单的实现供参考。

class TitleBar : public QWidget
{
    Q_OBJECT
public:
    explicit TitleBar(QWidget *parent = 0)
        :QWidget(parent)
    {
        QStyle *style = qApp->style();
        QIcon closeIcon = style->standardIcon(QStyle::SP_TitleBarCloseButton);
        QIcon maxIcon = style->standardIcon(QStyle::SP_TitleBarMaxButton);
        QIcon minIcon = style->standardIcon(QStyle::SP_TitleBarMinButton);

        QPushButton *min = new QPushButton(this);
        QPushButton *max = new QPushButton(this);
        QPushButton *close = new QPushButton(this);
        min->setIcon(minIcon);
        max->setIcon(maxIcon);
        close->setIcon(closeIcon);

        QHBoxLayout *layout = new QHBoxLayout(this);
        layout->setSpacing(0);
        layout->addWidget(min);
        layout->addWidget(max);
        layout->addWidget(close);
        setLayout(layout);
    }
};

1
很奇怪,这并没有做我期望的事情:在OSX上,按钮看起来和Windows上完全一样... - chacham15
“QMacStyle”在Qt开源版4.6.2中未实现。我不知道其他版本是否有。您可以自己实现“QMacStyle”。 - liuyi.luo
嗯,正是我需要的。得测试一下。 - swdev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接