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();
}