每 5 秒更改一次圆圈颜色

Change circle colour every 5 seconds

我尝试创建一个每 5 秒消失一次的绿色圆圈。

实际上,我用 QPainter 方法创建了绿色圆圈。我尝试了 QTimer 和其他方法,但找不到好的解决方案。

我像这样覆盖了 paintEvent 函数:

void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    Qt::BrushStyle style = Qt::SolidPattern;
    QBrush brush(Qt::green, style);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setBrush(brush);
    painter.drawEllipse(525, 5, 50, 50);
}
MainWindow::MainWindow() : QWidget()
{
    QTimer *ledtimer = new QTimer(this);
    connect(ledtimer, SIGNAL(timeout()), this, SLOT(run_led()));
    ledtimer->start(5000);
}

我试图做这样的事情,但是当我使用 run_led 时,它告诉我画家已经被删除(我在 MainWindow class 中尝试过)。

我了解信号功能和定时器,我在其他文件中使用过它,所以一些提示将不胜感激。我应该使用计时器让圆圈眨眼吗?

假设您的 MainWindow 继承了 QMainWindow


MainWindow::paintEvent(QPaintEvent *) 是一个函数,它告诉系统渲染您的 window。 所以我让你猜猜当你这样覆盖它时出了什么问题。

但是您可以将绘图放在为此制作的 QWidget 中:QGraphicsView 显示 QGraphicsScene .

的内容

你应该创建一个 slot 来做你想做的事,像这样:

void MainWindow::on_led_timer_timeout(){

/*
 Do stuff the the QGraphicsScene or QGraphicsView
*/

}

然后将 QTimer 的正确 signal 连接到它:

connect(ledtimer, &QTimer::timeout, this, &MainWindow::on_led_timer_timeout);

定义一个标志布尔值,每 5 秒更改一次,并在绘画中使用画笔作为全局变量

void MainWindow::paintEvent(QPaintEvent *)
{
    ....
    QBrush brush(myBrush, style);
    ...
}

and in slot (run_led)

void MainWindow::run_led()
{
    c != true;
    if(c)
    {
        myBrush=Qt::green;
    }
    else
    {
        myBrush=Qt::gray;
    }
}
class QSimpleLed : public QWidget
{
   Q_OBJECT
   Q_PROPERTY(QColor color READ color WRITE setColor)
public:
   using QWidget::QWidget;

   void setColor(const QColor& c) {
      if (m_color != m) {
          m_color = m;
          update();
      } 
   }

   QColor color() const;

   void paintEvent(QPaintEvent *) override;

private:
   QColor m_color;
}

上面的实现应该是显而易见的。

int main(int argc, char* argv[])
{
    QApplication app{argc, argv};

    QSimpleLed led;
    auto animation = new QPropertyAnimation(&led, "color");
    animation->setStartValue(Qt::red);
    animation->setEndValue(Qt::green);
    animation->setLoopCount(-1);
    animation->setDuration(5000);
    animation->start();

    led.show();
    return app.exec();
}