无法让派生的 QWidget 自行绘制

发布于 2025-01-07 17:13:57 字数 1662 浏览 5 评论 0原文

我通过从 QWidget 派生制作了自己的简单小部件,并试图让它在其 PaintEvent() 内绘制渐变。我在paintEvent中设置了一个断点,但它永远不会被调用,即使当我调整窗口大小等时也是如此。该小部件是设计器内升级的QWidget。 这是我的目标代码 - 我实际上还没有读取渐变颜色,只是想让 PaintEvent() 首先触发,呵呵。 首先是头文件:

#ifndef GRADIENT_H
#define GRADIENT_H

#include <QBrush>
#include <QPen>
#include <QPixmap>
#include <QWidget>


class Gradient : public QWidget
{
    Q_OBJECT

public:
    Gradient(QWidget *parent = 0);

    QSize minimumSizeHint() const;
    QSize sizeHint() const;

public slots:

protected:
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

private:

};

#endif // GRADIENT_H

然后是.cpp:

#include <QtGui>
#include <QPen>

#include "gradient.h"


Gradient::Gradient(QWidget *parent)
    : QWidget(parent)
{

   //setBackgroundRole(QPalette::Base);
    //setAutoFillBackground(true);
}

QSize Gradient::minimumSizeHint() const
{
    return QSize(20, 256);
}

QSize Gradient::sizeHint() const
{
    return QSize(20, 512);
}

void Gradient::resizeEvent(QResizeEvent * /* event */)
{
    //update();
    repaint();
}

void Gradient::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.fillRect(rect(), Qt::black);
    painter.setPen(QPen(Qt::blue,1));
   // painter.setBrush(?);

    for (int y = 0; y < height(); ++y)
    {
        painter.save();
      //painter.setPen(); <---here I plan to set different colors from a dynamic table
        painter.translate(0, y);

        painter.drawLine(0, 0, width(), 0);

        painter.restore();
    }
    painter.drawRect(QRect(0, 0, width() - 1, height() - 1));
}

I have made my own simple widget by deriving from QWidget, and am trying to get it to paint a gradient inside its paintEvent(). I set a breakpoint inside paintEvent, but it never gets called, even when I resize the window etc. The widget is a promoted QWidget from within the designer.
Here is my object code - I am not actually reading the gradient colors yet, just trying to get the paintEvent() to fire first hehe.
First, the header file:

#ifndef GRADIENT_H
#define GRADIENT_H

#include <QBrush>
#include <QPen>
#include <QPixmap>
#include <QWidget>


class Gradient : public QWidget
{
    Q_OBJECT

public:
    Gradient(QWidget *parent = 0);

    QSize minimumSizeHint() const;
    QSize sizeHint() const;

public slots:

protected:
    void paintEvent(QPaintEvent *event);
    void resizeEvent(QResizeEvent *event);

private:

};

#endif // GRADIENT_H

Then, the .cpp:

#include <QtGui>
#include <QPen>

#include "gradient.h"


Gradient::Gradient(QWidget *parent)
    : QWidget(parent)
{

   //setBackgroundRole(QPalette::Base);
    //setAutoFillBackground(true);
}

QSize Gradient::minimumSizeHint() const
{
    return QSize(20, 256);
}

QSize Gradient::sizeHint() const
{
    return QSize(20, 512);
}

void Gradient::resizeEvent(QResizeEvent * /* event */)
{
    //update();
    repaint();
}

void Gradient::paintEvent(QPaintEvent * /* event */)
{
    QPainter painter(this);
    painter.fillRect(rect(), Qt::black);
    painter.setPen(QPen(Qt::blue,1));
   // painter.setBrush(?);

    for (int y = 0; y < height(); ++y)
    {
        painter.save();
      //painter.setPen(); <---here I plan to set different colors from a dynamic table
        painter.translate(0, y);

        painter.drawLine(0, 0, width(), 0);

        painter.restore();
    }
    painter.drawRect(QRect(0, 0, width() - 1, height() - 1));
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

百合的盛世恋 2025-01-14 17:13:57

无需在 resizeEvent() 内调用 update()repaint()。但这也不应该破坏任何东西。升级的内容一定有问题,因为 paintEvent() 重写是正确的。我将它粘贴到我的 QWidget 子类中并且它可以工作。也许清理一切并重建?

There is no need to call update() or repaint() inside the resizeEvent(). But that shouldn't break anything either. There must be something wrong with the promoted stuff because that paintEvent() override is correct. I pasted it into a QWidget subclass on my end and it works. Perhaps a clean all and rebuild?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文