• 6149阅读
  • 4回复

[提问]QDialog.show() 怎么才能立刻显示?我要复制解压文件,怎么才能在复制过程中显示进度? [复制链接]

上一主题 下一主题
离线dllhd
 
只看楼主 倒序阅读 楼主  发表于: 2011-11-24
窗口定义:
class ShowMessageDlg : public QDialog
{
    Q_OBJECT
public:
    ShowMessageDlg(QWidget *p);

    ~ShowMessageDlg();
public slots:    
    void setText(QString str){text.setPlainText(str);}
    void addText(QString str){text.setPlainText(text.toPlainText()+str);}
private:    
    void showEvent(QShowEvent * event);    
    QTextEdit text;
    QGridLayout layout;
};

运行代码:希望的功能:弹出显示对话框,边拷贝,边显示拷贝过程。
    ShowMessageDlg *sm = new ShowMessageDlg(this);
    sm->show();//运行到这里是不会显示的
    for(int i = 0; i < fileNames.length(); i++)
    {
...
        sm->addText("正在复制,请稍侯...\n");
        if ( QFile::copy ( fn,dest ) )//如果文件很大,在这里鼠标会停顿,这个操作是不是一定要放在线程中呢?
        {
            sm->addText("复制完成\n");
            sm->addText(file_name ( fn.toLatin1() ));
            sm->addText("正在解压,请稍侯...\n");
            system ( cmd.toLatin1().data() );
            sm->addText("解压完成\n");
        }
    }
运行到这里才会显示出来。请问怎么让这个窗口立刻显示出来呢?
离线dbzhang800

只看该作者 1楼 发表于: 2011-11-24
引用楼主dllhd于2011-11-24 16:41发表的 QDialog.show() 怎么才能立刻显示?我要复制解压文件,怎么才能在复制过程中显示进度? :
窗口定义:
if ( QFile::copy ( fn,dest ) )//如果文件很大,在这里鼠标会停顿,这个操作是不是一定要放在线程中呢?


不该有疑问,耗时操作显然要交给其他线程。或者你能将其分割成小块,和其他东西交错执行,使得主线程不被阻塞。
离线dllhd
只看该作者 2楼 发表于: 2011-11-24
引用第1楼dbzhang800于2011-11-24 16:45发表的  :
不该有疑问,耗时操作显然要交给其他线程。或者你能将其分割成小块,和其他东西交错执行,使得主线程不被阻塞。



是啊,最近总是碰到这个问题,我也知道运算量大的代码应该放到另外的线程,可是这样会使开发难度和工作量加大,这是不是也算是QT的一个缺点呢?。
离线jdwx

只看该作者 3楼 发表于: 2011-11-24
回 2楼(dllhd) 的帖子
这个不是Qt的缺点,是所有程序的缺点。不管什么系统什么程序都有这个问题,不用多线程必然卡死。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线amala

只看该作者 4楼 发表于: 2011-11-24
ls是正解,况且用多线程的话也多不了几行代码
快速回复
限100 字节
 
上一个 下一个