style sheet setstylesheet examples example creator change qt qss

setstylesheet - qt style sheet example



Qt Stylesheet para widget personalizado (5)

Hay una respuesta mucho más fácil que escribir tu propio paintEvent : subclase QFrame lugar de QWidget y funcionará de inmediato:

class WidgetUnits : public QFrame { Q_OBJECT ....

Tengo varios artilugios personalizados en mi proyecto actual. Deseo aplicarles hojas de estilo y cuando lo hago dentro de Qt Creator, parece que funciona. Sin embargo, al ejecutar el programa, no se utiliza ninguna hoja de estilo. Las hojas de estilo para los widgets Qt funcionan normalmente.

¿Alguien tiene algún consejo? aquí hay un código relevante.

WidgetUnits.h

#ifndef WIDGETUNITS_H #define WIDGETUNITS_H #include <QList> #include <QWidget> #include <QPainter> #include <Widgets/JECButton.h> #include <Unit.h> #include <Time.h> namespace Ui { class WidgetUnits; } class WidgetUnits : public QWidget { Q_OBJECT public: explicit WidgetUnits(QWidget *parent = 0); ~WidgetUnits(); void setNumTimes(const int& numTimes); public slots: void updatePictures(const Time* time); protected: void paintEvent(QPaintEvent *event); private: void checkNewQueue(const QList<QList<Unit*>*>* units); Ui::WidgetUnits *ui; const int pictureWidth; // The width of the Unit pictures. const int pictureHeight; // The height of the Unit pictures. QList<QList<JECButton*>*> buttonPictures; // The Units'' pictures. The outer QList stores the QList of pictures for a given tick. // The inner QList stores the JECButtons for the specific tick. };

WidgetUnits.cpp

#include "WidgetUnits.h" #include "ui_WidgetUnits.h" WidgetUnits::WidgetUnits(QWidget *parent): QWidget(parent), ui(new Ui::WidgetUnits), pictureWidth(36), pictureHeight(36) { ui->setupUi(this); } WidgetUnits::~WidgetUnits() { delete ui; } void WidgetUnits::updatePictures(const Time *time) { // Only showing units that started to get built this turn. checkNewQueue(time->getUnits()); checkNewQueue(time->getBuildings()); checkNewQueue(time->getUpgrades()); // Updating the position of the remaining pictures (after some were removed). // Checking the maximum number of Units made in one tick. int maxNewQueue = 0; for (int a = 0; a < buttonPictures.length(); ++a) { if (buttonPictures.at(a)->length() > maxNewQueue) { maxNewQueue = buttonPictures.at(a)->length(); } } if (buttonPictures.length() > 0) { this->setGeometry(0, 0, buttonPictures.length() * 130, maxNewQueue * (pictureWidth + 10) + 20); QList<JECButton*>* tickButtons = 0; for (int a = 0; a < buttonPictures.length(); ++a) { tickButtons = buttonPictures.at(a); for (int b = 0; b < tickButtons->length(); ++b) { tickButtons->at(b)->move(a * 130, b * (pictureHeight + 10)); } } } update(); } void WidgetUnits::checkNewQueue(const QList<QList<Unit *> *> *units) { if (units != 0) { const Unit* currentUnit = 0; JECButton* currentButton = 0; for (int a = 0; a < units->length(); ++a) { buttonPictures.append(new QList<JECButton*>()); for (int b = 0; b < units->at(a)->length(); ++b) { currentUnit = units->at(a)->at(b); // Verifying that there is an item in the queue and the queue action was started this turn. if (currentUnit->getQueue() != 0 && currentUnit->getAction()->getTimeStart() == currentUnit->getAction()->getTimeCurrent() && (currentUnit->getAction()->getType() == Action::BUILD || currentUnit->getAction()->getType() == Action::TRAIN || currentUnit->getAction()->getType() == Action::UPGRADE)) { buttonPictures.last()->append(new JECButton(this)); currentButton = buttonPictures.last()->last(); QImage* image = new QImage(currentUnit->getQueue()->getUnitBase()->getImage().scaled(pictureWidth, pictureHeight)); currentButton->setImage(*image); currentButton->setGeometry(0, 0, currentButton->getImage().width(), currentButton->getImage().height()); currentButton->setColorHover(QColor(0, 0, 225)); currentButton->setColorPressed(QColor(120, 120, 120)); currentButton->setImageOwner(true); currentButton->setVisible(true); } } } } } void WidgetUnits::setNumTimes(const int &numTimes) { // Appending new button lists for added ticks. for (int a = buttonPictures.length(); a < numTimes; ++a) { buttonPictures.append(new QList<JECButton*>()); } } void WidgetUnits::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); }

Cualquier ayuda será apreciada.

El widget es visible. Configuré una información sobre herramientas que me mostró (es exactamente del mismo color que QScrollArea ).

Jec


Llamar a setAttribute(Qt::WA_StyledBackground, true) para el widget personalizado funcionó para mí.


Para completar, el mismo problema está presente en PyQt. Puede aplicar una hoja de estilo a un QWidget subclasificado agregando un código similar:

def paintEvent(self, pe): opt = QtGui.QStyleOption() opt.init(self) p = QtGui.QPainter(self) s = self.style() s.drawPrimitive(QtGui.QStyle.PE_Widget, opt, p, self)


Tuve el mismo problema con pyside. Publico mi solución solo por completitud. Es casi como en PyQt como propuso Pieter-Jan Busschaert. La única diferencia es que debe llamar a initFrom en lugar de init

def paintEvent(self, evt): super(FreeDockWidget,self).paintEvent(evt) opt = QtGui.QStyleOption() opt.initFrom(self) p = QtGui.QPainter(self) s = self.style() s.drawPrimitive(QtGui.QStyle.PE_Widget, opt, p, self)

Otra cosa que necesita asegurarse es que defina su widget personalizado en su archivo CSS de la siguiente manera:

FreeDockWidget{...}

y no como a menudo recomendado

QDockWidget#FreeDockWidget{...}


Tuve un problema similar y se resolvió usando el comentario de jecjackal. Como dijo Sjwarner, sería mucho más notable en forma de respuesta. Así que lo proporcionaré. Para el beneficio de cualquier espectador futuro. Nuevamente, ¡no es mi respuesta! ¡Aprecia el jecjackal por eso!

Como se dice en la referencia de las hojas de estilo de Qt, la aplicación de estilos CSS a los widgets personalizados heredados de QWidget requiere volver a implementar paintEvent () de esa manera:

void CustomWidget::paintEvent(QPaintEvent *) { QStyleOption opt; opt.init(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); }

Sin hacerlo, sus widgets personalizados solo admitirán las propiedades de fondo, fondo de clip y origen de fondo.

Puede leer sobre esto aquí: referencia de Qt Stylesheets en la sección "Lista de widgets con estilo" -> QWidget.