每 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();
}
我尝试创建一个每 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();
}