c++ - 如何使用 QStyle.drawControl() 呈现红色按钮?

标签 c++ qt qt4 qstyle

使用以下代码,我尝试使用 QStyle.drawControl() 渲染一个红色按钮:

#include <QtCore/QtCore>
#include <QtGui/QtGui>

class Widget : public QWidget
{
    virtual void paintEvent(QPaintEvent* event)
    {
        QStyleOptionButton opt;
        opt.palette = QPalette(Qt::red);
        opt.state = QStyle::State_Active | QStyle::State_Enabled;
        opt.rect = QRect(50, 25, 100, 50);
        QPainter painter(this);
        style()->drawControl(QStyle::CE_PushButton, &opt, &painter);
    }
};

int main(int argc, char** argv)
{
    QApplication app(argc, argv);
    Widget w;
    w.resize(200, 100);
    w.show();
    return app.exec();
}

但是我得到以下结果:

enter image description here

如何使用 QStyle.drawControl() 呈现红色按钮?

我在 Windows XP 上使用 Qt 4.8.1 和 Visal Studio 2010。

最佳答案

按钮由 native 样式引擎绘制,因此可能根本不会使用调色板(请参阅 FAQ 中的 that question)。

您可以使用带有样式表的实际按钮,该样式表作为最后一个参数传递给自己按钮的样式 drawControl 函数。

class Widget : public QWidget
{
  // To allow the automatic deletion without parenting it
  QScopedPointer<QPushButton> button;
public:
    Widget() : button(new QPushButton) {
      button->setStyleSheet("background-color: red");
    }
    virtual void paintEvent(QPaintEvent* event)
    {
        QStyleOptionButton opt;
        opt.state = QStyle::State_Active | QStyle::State_Enabled;
        opt.rect = QRect(50, 25, 100, 50);
        QPainter painter(this);
        button->style()->drawControl(QStyle::CE_PushButton, &opt, &painter, 
                                     button.data());
    }
};

但是您会失去原生样式,因此您必须伪造它(bali182's answer 可能对那部分有用)。

或者你也可以使用同一个带有着色效果的按钮,调用它的render()函数来绘制它:

Colorized Button

class Widget : public QWidget {
    QScopedPointer<QPushButton> button;
public:
    Widget() : button(new QPushButton) {
        QGraphicsColorizeEffect *effect = new QGraphicsColorizeEffect(button.data());
        effect->setColor(Qt::red);
        button->setGraphicsEffect(effect);
    }
    virtual void paintEvent(QPaintEvent* event) {
        button->setFixedSize(100, 50);
        button->render(this, QPoint(50, 25));
    }
};

关于c++ - 如何使用 QStyle.drawControl() 呈现红色按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901037/

相关文章:

c++ - QListView中的QT4 QstringListModel

c++ - 数中的最大整数

c++ - Qt下在widget中嵌入外部应用

c++ - 为什么旧的小部件没有被删除?

c++ - 调用 QDataStream::writeRawData 后 QDataStream 为空

qt4 - 如何使用 QProcess 在 Windows 上使用默认应用程序打开 PDF 文件?

c++ - 将元素从 char vector 复制到字符串 vector

c++ - <我在哪里转换?> 警告 C4244 : 'initializing' : conversion from '__int64' to 'int' , 可能丢失数据

c++ - 将 QComboBox 或 QSpinBox 设置为不允许的值

c++ - QDBusAbstractAdaptor 与 QDBusAbstractInterface