样式化的顶级QPushButton窗口小部件无法正确呈现

时间:2013-12-17 19:05:45

标签: qt

我已经成功地创建了一个QPushButton应用程序的顶级窗口小部件/窗口,并尝试按下样式:

#include <QPushButton>
#include <QApplication>

class MyButton : public QPushButton
{
public:
    MyButton() : QPushButton( "Button" )
    {
        setFixedSize( 250 , 65 );
        setStyleSheet( "border-radius: 10px;" ); // style
    }
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyButton b;
    b.setWindowFlags( Qt::FramelessWindowHint | Qt::CustomizeWindowHint | Qt::WindowStaysOnTopHint );
    b.setAttribute(Qt::WA_TranslucentBackground); // Fixes opaque BG
    b.show();

    return a.exec();
}

不幸的是,如下图所示,应用样式时,按钮不再正确呈现。我很感激帮助让按钮正确渲染风格。

enter image description here

修改

按照Kuber Obas的回答,我很感激帮助设计窗口小部件的边缘,即圆角外的边缘,使其透明,如下所示

enter image description here

1 个答案:

答案 0 :(得分:4)

在大多数原生样式中,使用本机功能使用按钮的其余部分绘制边框,并且不能逐个替换其元素。一旦你介绍了自己的样式,单片本机样式就消失了。因此,您需要替换本机样式提供的所有功能,包括边框,背景渐变等。如果您需要,您需要调整它以“匹配”原生样式。

在这里,您需要完全重新定义边框:至少提供笔border:)。半径只对笔有意义。您还需要重新定义背景,如果您关心背景,重新定义所有按钮的状态选择器等。您可以从一个没有样式的按钮开始!

下面的屏幕截图很好地展示了它。在左边你有一个Mac风格的原生按钮,在右边你有一个按钮,其边界重新定义。显然,在这种情况下,还应调整默认状态背景以匹配平台的背景,并且需要添加一些余量。

Qt并没有完全从头开始重新做现代原生风格,这就是为什么你不能调整他们各自的元素。这是太多的工作和不断变化的目标。它曾经是旧的Windows-95 / NT风格。从XP风格开始,决定让平台API提供视觉样式位图。类似的事情可能发生在OS X上。这也是你不能在其原生平台之外使用更高级的XP / Aqua / Mac Qt样式的原因:相关的原生API不存在,因此样式被禁用。

screenshot

// https://github.com/KubaO/stackoverflown/tree/master/questions/styledbutton-20642553
#include <QPushButton>
#include <QHBoxLayout>
#include <QApplication>

int main(int argc, char *argv[])
{
   QApplication a{argc, argv};
   QWidget w;
   QHBoxLayout layout{&w};
   QPushButton button1{"Default"};
   button1.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
   layout.addWidget(&button1);
   QPushButton button2{"Styled"};
   button2.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
   button2.setStyleSheet(
      "* { border: 2px solid #8f8f91; border-radius: 12px; background-color: #d02020; }"
      "*:pressed { background-color: #f6f7fa; }");
   layout.addWidget(&button2);
   auto pal = w.palette();
   pal.setBrush(QPalette::Background, Qt::darkBlue);
   w.setPalette(pal);
   w.show();
   return a.exec();
}