C++ QGraphicsView不';不要总是更新

C++ QGraphicsView不';不要总是更新,c++,qt,qgraphicsview,qgridlayout,C++,Qt,Qgraphicsview,Qgridlayout,嗨,我有一个GridLayout,上面有64个GraphicsView(我知道很多,但这是我现在唯一能想到的方法)。 现在,我正在一个计时器刻度上,在每个图形视图上随机画一条线。这是可行的,但仅适用于8种图形, 创建图形视图 void模拟::CreateGraphicsView(){ 对于(int i=0;iaddLine(-1,0,1,0,QPen(Qt::darkBlue,0.1)); 直线->设置旋转(角度); } } int main(int argc,char*argv[]) { 质量

嗨,我有一个GridLayout,上面有64个GraphicsView(我知道很多,但这是我现在唯一能想到的方法)。 现在,我正在一个计时器刻度上,在每个图形视图上随机画一条线。这是可行的,但仅适用于8种图形, 创建图形视图
void模拟::CreateGraphicsView(){ 对于(int i=0;i<64;i++){ 对于(int j=0;j<8;j++){

每个图形视图中的随机线

for(int x = 0; x < 64; x++){
    x1 = qrand()%(50+1) - 1;
    y1 = qrand()%(50+1)-1;
    x2 = qrand()%(50+1)-1;
    y2 = qrand()%(50+1)-1;
    graphicsScene[x]->addLine(x1,y1,x2,y2);
    qDebug() << "adding line to" << x << "at" << x1 <<","<<y1<<","<<x2<<","<<y2;
}
 for(int x = 0; x < 64; x++){
        graphicsView[x]->show();
        qDebug()<<"showing" << x;
  }
for(int x=0;x<64;x++){
x1=qrand()%(50+1)-1;
y1=qrand()%(50+1)-1;
x2=qrand()%(50+1)-1;
y2=qrand()%(50+1)-1;
graphicscene[x]->addLine(x1,y1,x2,y2);

qDebug()下面的操作正常。请确保在.pro文件中启用了C++11:将
CONFIG+=C++11
添加到项目文件中

#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QGridLayout>
#include <QTime>
#include <QTimer>
#include <array>

class View : public QGraphicsView
{
public:
   View(QWidget *parent = 0) : QGraphicsView(parent) {
      setRenderHint(QPainter::Antialiasing);
   }
   void resizeEvent(QResizeEvent *) {
      fitInView(-1, -1, 2, 2, Qt::KeepAspectRatio);
   }
};

template <typename Container>
void updateScenes(Container & views)
{
   auto angle = 360.0/1000.0 * (QTime::currentTime().msecsSinceStartOfDay() % 1000);
   for (auto & view : views) {
      auto scene = view.scene();
      scene->clear();
      auto * line = scene->addLine(-1, 0, 1, 0, QPen(Qt::darkBlue, 0.1));
      line->setRotation(angle);
   }
}

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QGraphicsScene s;
   QTimer timer;
   QWidget window;
   QGridLayout layout(&window);
   std::array<View, 64> views;

   int i = 0;
   for (auto & view : views) {
      view.setScene(new QGraphicsScene(&view));
      layout.addWidget(&view, i/8, i%8);
      ++ i;
   }

   QObject::connect(&timer, &QTimer::timeout, [&views]{ updateScenes(views); });
   timer.start(50);
   window.show();
   return a.exec();
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类视图:公共QGraphicsView
{
公众:
视图(QWidget*父视图=0):QGraphicsView(父视图){
SetRenderInt(QPaint::抗锯齿);
}
void resizeEvent(QResizeEvent*){
fitInView(-1,-1,2,2,Qt::keepasspectratio);
}
};
模板
void updateScenes(容器和视图)
{
自动角度=360.0/1000.0*(QTime::currentTime().msecsSinceStartOfDay()%1000);
用于(自动查看:视图(&W){
自动场景=view.scene();
场景->清除();
auto*line=scene->addLine(-1,0,1,0,QPen(Qt::darkBlue,0.1));
直线->设置旋转(角度);
}
}
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
qs;
定时器;
QWidget窗口;
QGridLayout(窗口和窗口);
std::数组视图;
int i=0;
用于(自动查看:视图(&W){
view.setScene(新的qgraphicscene(&view));
layout.addWidget(视图和视图,i/8,i%8);
++一,;
}
连接(&timer,&QTimer::timeout,[&views]{updateScenes(views);});
定时器启动(50);
window.show();
返回a.exec();
}

无需“显示”更新后的视图,它们的全部要点是,只要底层场景被修改,它们都会自动更新。您需要发布一个完整的、自包含的、单文件的示例,说明您正在尝试执行的操作。若要获得灵感,请查看OK,认为可能需要显示,或至少重新绘制(最后的C++ GUI我做的是C++ .NET)这是整个.cpp和头文件,我只把模拟放进去了,因为另一位atm只是一个开始菜单。atm只是在每个图形视图中画一条随机线,实际上是一个测试,然后我将在实际模拟后面添加逻辑。你的代码必须包含在问题本身中,并且你必须最小化它。到目前为止,你的问题是您正在运行一个本地事件循环。在不完全了解Qt的内部工作原理的情况下,千万不要这样做。请澄清一下,即使我试图在GraphicsView中画一条线,而这条线在事件循环之外不起作用(因此完全注释掉循环)这行代码仍然不会写出来。非常感谢,我刚刚在一个单独的程序中对其进行了测试,效果非常好。我将重新编写我的其余代码,以便在中链接类似的内容。谢谢:)
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QGridLayout>
#include <QTime>
#include <QTimer>
#include <array>

class View : public QGraphicsView
{
public:
   View(QWidget *parent = 0) : QGraphicsView(parent) {
      setRenderHint(QPainter::Antialiasing);
   }
   void resizeEvent(QResizeEvent *) {
      fitInView(-1, -1, 2, 2, Qt::KeepAspectRatio);
   }
};

template <typename Container>
void updateScenes(Container & views)
{
   auto angle = 360.0/1000.0 * (QTime::currentTime().msecsSinceStartOfDay() % 1000);
   for (auto & view : views) {
      auto scene = view.scene();
      scene->clear();
      auto * line = scene->addLine(-1, 0, 1, 0, QPen(Qt::darkBlue, 0.1));
      line->setRotation(angle);
   }
}

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   QGraphicsScene s;
   QTimer timer;
   QWidget window;
   QGridLayout layout(&window);
   std::array<View, 64> views;

   int i = 0;
   for (auto & view : views) {
      view.setScene(new QGraphicsScene(&view));
      layout.addWidget(&view, i/8, i%8);
      ++ i;
   }

   QObject::connect(&timer, &QTimer::timeout, [&views]{ updateScenes(views); });
   timer.start(50);
   window.show();
   return a.exec();
}