C++ 如何使QGraphicsView背景每秒以R-G-B闪烁

C++ 如何使QGraphicsView背景每秒以R-G-B闪烁,c++,qt,c++11,qt5,qgraphicsview,C++,Qt,C++11,Qt5,Qgraphicsview,正如标题所说,我正试图让我的QGraphicsView以红色闪烁1秒,以绿色闪烁1秒,以蓝色闪烁1秒,然后循环再次开始。在过去几天做了大量的研究之后,我运气不太好,因为主要的问题是我不确定我是否需要子类QGraphicsView来获得我想要的效果。我遇到了一些我在下面插入的参考资料,它们说对于这类问题,qPropertyImation似乎是正确的方向。尽管设置QTimer也是一种选择 下面是一个可验证的小示例。我编写了最少的代码: main window.h #ifndef MAINWINDOW

正如标题所说,我正试图让我的
QGraphicsView
以红色闪烁1秒,以绿色闪烁1秒,以蓝色闪烁1秒,然后循环再次开始。在过去几天做了大量的研究之后,我运气不太好,因为主要的问题是我不确定我是否需要子类
QGraphicsView
来获得我想要的效果。我遇到了一些我在下面插入的参考资料,它们说对于这类问题,
qPropertyImation
似乎是正确的方向。尽管设置
QTimer
也是一种选择

下面是一个可验证的小示例。我编写了最少的代码:

main window.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QPropertyAnimation>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QGraphicsView *mView;
    QGraphicsScene *mScene;
    QPropertyAnimation *mAnimation;
};
#endif // MAINWINDOW_H
#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H
#include <QGraphicsView>
class MyGraphicsView : public QGraphicsView
{
public:
    MyGraphicsView();
};

#endif // MYGRAPHICSVIEW_H
main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
我一直在研究一个
QGraphicsView
以红色闪烁1秒,绿色闪烁1秒,蓝色闪烁1秒的可能性,然后循环重新开始

提供完整示例的唯一来源是
PyQt
,对此我并不熟悉。来源是,也是

我从这些例子中得到的最重要的线索是,特别是最后一个例子,使用
QState
QStateMachine
。不过,我对
Qt
的这两个特性一点也不熟悉,因此我有点挣扎

我还遇到了部分示例,其中的好处是我学会了如何设置
QTimer
用于1s间隔闪烁

另外,因为我处理的是
QGraphicsView
我觉得应该使用
void paintEvent(QPaintEvent*)覆盖


非常感谢您指出正确的方向并解决此问题。

使用
QPropertyAnimation
在这里是一个问题,因为支持的类型列表是:

Int、UInt、Double、Float、QLine、QLineF、QPoint
QPointF、QSize、QSizeF、QRect、QRectF、QColor
如果查看
QGraphicsView
类层次结构的可用属性

QWidget

QFrame

QAbstractScrollArea

QGraphicsView


没有要传递给
qPropertyImation
的有趣属性,因为
qpalete
QString
不支持使用
setPalette()
styleSheet()
进行播放,并且没有直接更改背景颜色的变量


解决方案是将QGraphicsView子类化:
图形视图.h

\ifndef图形视图
#定义图形视图
#包括
#包括
类GraphicsView:公共QGraphicsView
{
Q_对象
公众:
GraphicsView(QWidget*parent=nullptr);
受保护的:
无效paintEvent(QPaintEvent*evt)覆盖;
专用插槽:
void changeBackgroundColor();
私人:
int颜色指数;
定时器;
常量QColor colors[3]={Qt::red,Qt::green,Qt::blue};
};
#endif//GRAPHICSVIEW\u H
图形视图.cpp

#包括“graphicsview.h”
GraphicsView::GraphicsView(QWidget*父项)
:QGraphicsView(父级)
{
颜色指数=-1;
连接(&计时器,信号(超时()),此,插槽(changeBackgroundColor());
定时器启动(1000);
}
void GraphicsView::paintEvent(QPaintEvent*evt)
{
QGraphicsView::paintEvent(evt);
QPainter painter(viewport());
painter.fillRect(viewport()->rect(),colors[color_index]);
}
void GraphicsView::changeBackgroundColor()
{
如果(颜色指数=2){
颜色指数=0;
}否则{
颜色指数++;
}
viewport()->更新(rect());
}

QPropertyAnimation
是一个不错的解决方案,但您不能在这种情况下使用它,因为没有允许直接更改背景颜色的
属性,您可以使用qpalete,但它不适用于
QPropertyAnimation
,一个可能的解决方案确实是重新实现
paintEvent()
但是有很多解决方案。。。使用
qgraphicscene
,使用
QGraphicsView
等。非常感谢您的详细解释。我运用了你的建议,它完全符合我的要求。我也明白您为什么提到
qpropertyanation
限制。谢谢你的时间!非常感谢!!:)
#include "mygraphicsview.h"

MyGraphicsView::MyGraphicsView()
{}
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>277</width>
    <height>228</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QGraphicsView" name="graphicsView"/>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>277</width>
     <height>22</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>