用不同的线程处理gui

时间:2009-09-07 01:57:26

标签: c++ user-interface qt multithreading qt4

我是qt和c ++的新手,我遇到线程问题。

例如,如果我有一个带有两个QPushButton和一个QTextEdit的gui,是否可以从一个线程(不同于gui主线程)设置QTextEdit的值而不冻结gui?

// These are the values that I want to set from the thread  
for(i=0;i<100;i++){  
     qtextedit.setText(i);  
}

2 个答案:

答案 0 :(得分:3)

可以:使用带有排队连接的信号/插槽,或将事件发布到GUI线程。

你的例子足够快,但不能阻止GUI。

答案 1 :(得分:2)

您不应该直接在另一个线程中使用您的示例。但是,使用信号和插槽将事物处理成一个好的形式并不困难。

class UpThread : public QThread
{
    Q_OBJECT
    ...
public slots:
    void countUp() 
    {
        for ( int i = 0; i < 100; ++i )
        {
             emit  ( newText( QString::number( i ) ) );
             sleep( 1 );
        }
    }

signals:
    void newText( QString text );
}

class DownThread : public QThread
{
    Q_OBJECT
    ...
public slots:
    void countDown() 
    {
        for ( int i = 100; i > 0; --i )
        {
             emit  ( newText( QString::number( i ) ) );
             sleep( 1 );
        }
    }

signals:
    void newText( QString text );
}

int main( int argc, char **argv )
{
    QApplication app( argc, argv );
    MainWindow window;
    UpThread up;
    DownThread down;
    QObject::connect( window.buttonUp, SIGNAL( clicked() ), &up, SLOT( countUp() ) );
    QObject::connect( &up, SIGNAL( newText( QString ) ), &window.textEntry, SLOT( setText( QString ) ) );
    QObject::connect( window.buttonDown, SIGNAL( clicked() ), &down, SLOT( countDown() ) );
    QObject::connect( &down, SIGNAL( newText( QString ) ), &window.textEntry, SLOT( setText( QString ) ) );

    window.show();
    up.run();
    down.run();

    return ( app.exec() );
}

注意:我没有编译或测试过这个。上下不关心另一个是否正在运行,因此如果单击两个按钮,您的文本条目可能会跳到整个地方。我显然遗漏了很多东西。我还在每个循环中添加了sleep( 1 ),以表明它们不应该阻止主UI。