Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 画一个椭圆,再画一个_C++_Qt_Qt5 - Fatal编程技术网

C++ 画一个椭圆,再画一个

C++ 画一个椭圆,再画一个,c++,qt,qt5,C++,Qt,Qt5,我需要画一个椭圆,经过一段时间后再画一个。 我做这件事有困难 这是我实际正在做的代码的简化版本,但我相信这将帮助我解决问题 这是代码 MyView::MyView() { sc = new QGraphicsScene(); this->setSceneRect(0,0,800,600); this->setFixedSize(800,600); this->setStyleSheet("QScrollBar {height:0px;}");

我需要画一个椭圆,经过一段时间后再画一个。 我做这件事有困难

这是我实际正在做的代码的简化版本,但我相信这将帮助我解决问题

这是代码

MyView::MyView()
{
    sc = new QGraphicsScene();
    this->setSceneRect(0,0,800,600);
    this->setFixedSize(800,600);
    this->setStyleSheet("QScrollBar {height:0px;}");
    this->setStyleSheet("QScrollBar {width:0px;}");
    sc->setSceneRect(0,0,800,600);
    this->setScene(sc);

}

void MyView::mousePressEvent(QMouseEvent *event)
{
    sc->addEllipse(event->x(),event->y(),10,10,QPen(),QBrush(Qt::red));
    int i=0;
    while(i < 1000000000)   // SIMULATING DELAY
        i++;                //
    sc->addEllipse(event->y(),event->x(),10,10,QPen(),QBrush(Qt::blue));
}
第一个椭圆直到结束时才显示,第二个椭圆出现
时间有多长并不重要。始终同时绘制两个省略号。

在GUI的主线程中,您不应该有花费太多时间的任务,因为它们会阻止eventloop,从而阻止GUI自己的工作被执行。在您的情况下,while循环可以替换为QTimer:

void MyView::mousePressEvent(QMouseEvent*event)
{
QPointF p=maptosene(事件->位置());
sc->addEllipse(QRectF(p,QSizeF(10,10)),QPen(),QBrush(Qt::red));
//1000是以毫秒为单位的延迟
QTimer::singleShot(1000,this,[this,p](){
sc->addEllipse(QRectF(p,QSizeF(10,10)),QPen(),QBrush(Qt::blue));
});    
}

您需要在程序暂停之前通过调用
flush()
刷新X协议缓冲区。同样的原因,你不会看到
std::注意到
while(i
class MyView : public QGraphicsView
{
public:
    MyView();
    QGraphicsScene *sc;
public slots:
    void mousePressEvent(QMouseEvent *event);
};
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyView wv;
    wv.show();

    return a.exec();
}