Qt啟動C++線程並在線程中修改界面


 這里以在線程中訪問excel,然后讀取完成在界面提示

1、按鈕啟動線程

void Mystack::on_pushButton_9_clicked()
{
    QString str =  QFileDialog::getOpenFileName(this);
    if(str == "")
    {
        return;
    }
    std::thread t(&Mystack::getTrackData,this,str);
    t.detach();
    ui->label_147->setText("");
}

2、線程函數

void Mystack::getTrackData(QString path)//path是excel的路徑
{
    (void)CoInitialize(NULL);
    //讀取excel所有數據
    QAxObject * excel = new QAxObject("Excel.Application");//選擇excel軟件
    excel->dynamicCall("Setvisible (bool Visible)","false");//不顯示主窗體,后面打開excel的時候不顯示
    excel->setProperty("DisplayAlerts",false);//不顯示excel的警告信息,如果打開失敗,不彈出框
    QAxObject *work_books = excel->querySubObject("WorkBooks");//選擇work_books
    work_books->dynamicCall("Open(const QString&)", path);//設置excel存在路徑
    QAxObject *work_book = excel->querySubObject("ActiveWorkBook");//選擇work_book
    QAxObject *work_sheet = work_book->querySubObject("Sheets(int)",1); //Sheets也可換用WorkSheets,打開第一個sheet
    QAxObject *range_data = work_sheet->querySubObject("UsedRange");
    QVariant var = range_data->dynamicCall("Value");//將所有數據存在QVariant結構體里面
    //excel內存回收
    delete range_data;
    delete work_sheet;
    delete work_book;
    delete work_books;
    delete excel;
    //獲取到所有數據
    allDataTvlist.clear();
    castVariant2ListListVariant(var,allDataTvlist);//自定義函數
    QList<QString> list;
    QString tmpStr;
    for(int i=1;i<allDataTvlist.size();i++)
    {
        tmpStr = allDataTvlist.at(i).at(0).toString();
        if(tmpStr=="批號")
        {
            continue;
        }
        if(NOT_FOUND==list.indexOf(tmpStr))
        {
            list.append(tmpStr);
        }
    }
    ui->comboBox->clear();//直接訪問this的ui對象
    foreach (const QString &value, list)
    {
        ui->comboBox->addItem(value);
    }
    ui->comboBox->setCurrentIndex(0);
    ui->label_147->setText("請選擇指定批號上傳");
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM