2013-12-17 2 views
1

я успешно сделал QPushButton верхнего уровень виджета/окно приложения и пытает стиль кнопки, как так:стилизованных верхнего уровня 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

+0

+1 для автономного кода! Браво! –

+0

Вам нужно показать свой код, иначе я не буду знать, как вам помочь. Я редактировал код ниже, чтобы показать, что фон правильно обрабатывается по краям. –

+1

Проблема решена. Все, что я должен был сделать, это установить атрибут 'Qt :: WA_TranslucentBackground '' на кнопку. (Код, показанный выше.) – Olumide

ответ

4

В большинстве родных стилей граница рисуется остальной частью кнопки с использованием встроенной функциональности и ее элементов ts нельзя заменить один за другим. Как только вы представите свой собственный стиль, монолитный родной стиль ушел. Таким образом, вам нужно будет заменить все функции, предоставляемые родным стилем, включая границу, фоновый градиент и т. Д. Вам нужно будет настроить его, чтобы «соответствовать» родному стилю, если вам это нужно.

Здесь вам необходимо полностью пересмотреть границу: в минимальной степени предоставить ручку (border:). Радиус имеет смысл только с пером. Вам также необходимо переопределить фон, если вы его позаботитесь, переопределить все переключатели состояния кнопки и т. Д. Вы начинаете с незакрепленной кнопки!

Снимок экрана ниже демонстрирует его хорошо. Слева у вас есть собственная кнопка в стиле Mac, справа у вас есть кнопка с только ее границей, определенной заново. Очевидно, что фон состояния по умолчанию также должен быть скорректирован так же, как и в случае с платформой в этом случае, и необходимо добавить некоторый запас.

Qt действительно не переделывает современные родные стили целиком с нуля, поэтому вы не можете настроить их отдельные элементы. Это будет слишком много работы и постоянно движущейся цели. Раньше это делалось для старого стиля Windows-95/NT. Начиная с стиля XP, было решено, чтобы API-интерфейсы платформы отображали растровые изображения визуального стиля. Подобная вещь предположительно происходит на OS X. Это также причина, по которой вы не можете использовать стили fancier 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(); 
} 
+0

@ Кубер Не принимайте это неправильно, но я очень люблю вас очень :) – Olumide

Смежные вопросы