碰到个好奇怪的问题



  • 我在widget构造函数里运行了循环刷新界面的函数
    void go()
    {
    while(on)
    {
    ...
    repaint();
    QApplication::processevent();
    }
    }
    然后在closeevent里边这样写
    on=false;
    运行程序,界面打开~按下alt+F4
    运行到了closeevent,并且widget关闭,但是Qt界面显示程序仍在运行,要按下那个红方块才行,但是会显示异常退出。

    如果在构造函数里没有go();程序能正常退出。
    如果在main里边加一句...
    widget w;
    w.show();//加上的
    窗口在关闭后能再次打开,此时按下alt+F4,能正常关闭!
    希望能得到帮助,以及查找问题的步骤!

    然后又手贱试了下...
    如果在widget中加入
    this->deletelater
    会发现析构函数被执行了两次...
    一次实在widget里,一次在main里边
    不应该每次执行析构都表明一个实例被释放了么...
    那么执行两次说明有两个?!
    万分感激!



  • 建议使用QTimer来刷新界面,使用死循环这种方法实在是不好,会耗CPU到50%的!
    使用QTimer的方法很简单:
    @QTimer timer;
    timer.setInterval( 16 );// 大概60次/秒
    connect( &timer, SIGNAL( timeout( ) ), this, update( ) );@



  • [quote author="jiangcaiyang" date="1375160837"]建议使用QTimer来刷新界面,使用死循环这种方法实在是不好,会耗CPU到50%的!
    使用QTimer的方法很简单:
    @QTimer timer;
    timer.setInterval( 16 );// 大概60次/秒
    connect( &timer, SIGNAL( timeout( ) ), this, update( ) );@[/quote]

    QTimer精度低...我想精度在2ms以内..



  • 如果是两毫秒内的话,那么还是使用循环吧,但是不建议你那么写。
    可以这样:
    @while ( loop )
    {
    loop = CheckIfQuit( );
    Render( );
    }

    bool CheckIfQuit( void )
    {
    if ( XButtonIsPressed( ) ) return false;
    else return true;
    }@



  • [quote author="jiangcaiyang" date="1375182647"]如果是两毫秒内的话,那么还是使用循环吧,但是不建议你那么写。
    可以这样:
    @while ( loop )
    {
    loop = CheckIfQuit( );
    Render( );
    }

    bool CheckIfQuit( void )
    {
    if ( XButtonIsPressed( ) ) return false;
    else return true;
    }@[/quote]

    真是非常好的主意,从没有想到,不过...怎么在Qt不通过事件循环直接渲染...另外还要收网络命令...我再研究研究...



  • 在游戏中一般是这么写的。
    但是呢,我昨晚想了一下,我以前在使用QWidget的时候,还可以这么写。
    @Widget::paintEvent( QPaintEvent* pEvent )
    {
    DoSomeRendering( );
    repaint( );// 或者update( )如果你需要来自队列的渲染指令的话
    }@
    这样毫不影响对X按钮关闭的操作。



  • [quote author="jiangcaiyang" date="1375233704"]在游戏中一般是这么写的。
    但是呢,我昨晚想了一下,我以前在使用QWidget的时候,还可以这么写。
    @Widget::paintEvent( QPaintEvent* pEvent )
    {
    DoSomeRendering( );
    repaint( );// 或者update( )如果你需要来自队列的渲染指令的话
    }@
    这样毫不影响对X按钮关闭的操作。[/quote]

    的确啊~原来还以为repaint也是经过队列的~一直搞混了,多谢!准备为事件做个过滤,一旦开始刷新,只接受自己需要的事件...


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.