我的程式有 3 個具有不同功能的選項卡,我今天注意到了這個問題:在第三個選項卡中啟動函式時,該選項卡在單獨的執行緒中運行,但更新此選項卡上的 QPlainText 小部件(有時幾秒鐘一次,有時每次更新不到一秒鐘,并且需要一分鐘,比如說加載進度條)我不能在另一個選項卡上使用功能和小部件,尤其是當我必須在點擊開始按鈕之前向 lineEdit 小部件輸入一些文本時——這是不可能的,因為我馬上就離開了lineEdit(或者我必須用滑鼠單擊它并快速輸入一個字符)。我從 QT 教程和其他網站知道 GUI 在一個主執行緒中運行,但我想知道如果這是真正的問題,像 KDE for Linux 這樣的大型專案是如何撰寫的。如何讓它不阻塞?
//EDIT 所以我正在使用 QTabWidget 但沒關系,在 Tab3 上我正在啟動新執行緒,它會發出一些 API 請求和計算,然后發出信號來更新 QPlainTextEdit:
void QtWidgetsApplication1::on_pushButton_2_clicked() {
mThread = new QThread;
worker = new BinconThreadWorker;
worker->Stop = false;
QObject::connect(mThread, SIGNAL(started()), worker, SLOT(process()));
QObject::connect(worker, SIGNAL(valueChanged(std::string)), this, SLOT(onValueChanged(std::string)));
QObject::connect(worker, SIGNAL(valueSecChanged(std::string)), this, SLOT(onValueSecChanged(std::string)));
QObject::connect(worker, SIGNAL(finished()), mThread, SLOT(quit()));
QObject::connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
QObject::connect(mThread, SIGNAL(finished()), mThread, SLOT(deleteLater()));
worker->moveToThread(mThread);
mThread->start();
}
void QtWidgetsApplication1::onValueChanged(std::string s) {
ui.plainTextEdit->appendPlainText(QString::fromStdString(s));
ui.plainTextEdit->verticalScrollBar()->setValue(maximumHeight());
}
void QtWidgetsApplication1::onValueSecChanged(std::string s) {
ui.plainTextEdit->setFocus();
QTextCursor storeCursorPos = ui.plainTextEdit->textCursor();
ui.plainTextEdit->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
ui.plainTextEdit->moveCursor(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
ui.plainTextEdit->moveCursor(QTextCursor::End, QTextCursor::KeepAnchor);
ui.plainTextEdit->textCursor().removeSelectedText();
ui.plainTextEdit->textCursor().deletePreviousChar();
ui.plainTextEdit->setTextCursor(storeCursorPos);
ui.plainTextEdit->appendPlainText(QString::fromStdString(s));
ui.plainTextEdit->verticalScrollBar()->setValue(maximumHeight());
}
同時,我想在 Tab2 上做其他事情,其中?? QLineEdit 小部件和按鈕在此選項卡上執行某些操作,但是當我單擊 QLineEdit 小部件時,游標會消失,因此我無法輸入任何文本,因為 Tab3 上的 QPlainTextEdit 正在獲取信號所以它會更新它的內容,并在我嘗試使用它時停用另一個選項卡上的 QLineEdit。僅當 QPlainTextEdit 在短時間內(1 秒以下)更新時才會發生這種情況。
uj5u.com熱心網友回復:
問題只是宣告...
ui.plainTextEdit->setFocus();
在QtWidgetsApplication1::onValueSecChanged. 它從當前焦點持有者“竊取”輸入焦點 -QLineEdit在你的情況下。只需洗掉該行,事情就會按預期作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/431569.html
