QT多線程查詢數據庫顯示到tablewidget里面
1、線程內注冊與連接數據庫的競爭問題
文檔上對多線程下數據庫應用的注意事項寫的很簡明,一個線程創建的 QSqlDatabase 對象和 查出來的 QSqlQuery 對象只能給本線程用(注意,是對象,不是數據庫連接本身,連接本身用名字可以多線程使用),其他情況是“不支持的”。在一個需要有幾個線程并發訪問不同數據庫的應用中,我首先試圖在各個線程的起始分別以不同的名稱調用 addDatabase / database 、open,但是程序偶然會崩潰,跟蹤后發現,雖然Qt 聲稱很多方法是“線程安全”的,但是幾個方法串起來,就出問題了。Qt 會動態的加載數據庫的plugin, 加載 plug in 的部分,涉及到對本地庫文件的管理,這一部分,出現了競爭。于是,很自然的想到在初始連接部分設置 Mutex 保護,從 addDatabase / database到 open 的部分,要保證其原子性,問題再也沒有出現。
2、數據庫連接意外斷裂后,恢復連接的問題
在MFC 中,一旦中途TCP連接斷裂,直接重新 Open 就可以了。在Qt 里,這一招不好使了。即便 調用了 close ,再次open 也是不行的。處理方法:
在檢測到問題出現后,關閉連接,并 removeDatabase; 而后,不要立刻 addDatabase, 反而是要回到該連接所在的事件循環。沒有詳細跟源碼,很可能在 removeDatabase 后的事件循環中,Qt 內部做了一些釋放操作。 怎么辦呢, 可以設置一個恢復定時器,比如 1分鐘,重新 addDatabase,就可以啦。如果心急的話,直接顯式調用processEvent() 方法強制循環。
在多線程下,注意1中的問題,需要 Mutex保護。
3、數據庫插件的依賴性問題
在 Windows 下,有時我們的機器上按了好幾個 Qt 版本,PATH里索性神馬也不設置,依賴開發環境的繼承環境適應不同的版本。這有兩個問題。一是發布程序的時候,數據庫驅動依賴的dll 也要與可執行文件在同一路徑下發布。比如 mysql 的 dll, PostgreSQL 的依賴等。二是在集成開發環境中,這些依賴也要位于執行檔文件夾下。否則,會造成雖然可以枚舉到可用驅動,但是死活連接不上。調試一下就知道,原來是在路徑中找不到依賴項,導致dll加載失敗哦!
各位QT大俠: QT多線程編程的時候,怎么把次線程處理好的數據實時的顯示到ui上去?
我的主線程就一個MainWindow,里面由一個TableWidget,怎么把我的次線程里面的數據實時顯示到這個TableWidget上?次線程主要完成從另外一個計算機接收UDP數據,并完成解析。Qt上要求界面處理一般需要在主線程中完成。
所以最好把次線程中的數據緩沖區放到主線程中:
1、一種方式可以進行數據拷貝,但肯定效率低了。
2、另一種方式是直接將數據緩沖區放到主線程中,然后在主線程中處理讀取數據槽。但這樣可能主線程壓力大,機器配置不能太低。
3、直接在主線程中訪問次線程的數據并刷新界面,不過這處理起來復雜(需要手工同步),容易出錯。
4、將TableWidget指針傳入次線程中,直接在次線程中對其進行操作并發送刷新信號。這種方式未經驗證,感覺可能性不大:一方面指針容易走空,另一方面就是前面說的限制在主線程中對接面進行處理。不過所說的“處理”可能并不包括刷新數據吧。
期待樓主進行驗證,并展示結果。(或者樓主可以將UDP試驗項目發送給我,讓我試試,QQ:956693152,謝謝?。?/div>
QT中怎么在tableview中顯示表格數據
誰知道為什么我運行程序在tableview中空白一片,我數據庫表格有數據的
看看Qt文檔中的QSqlTableModel類 有列子的,可以直接顯示到Tableview
怎么用Qt的TableView來顯示數據,數據有些來自MySQL的表中(多張不同的表),并且有些數據并不是從MySQL取
怎么用Qt的TableView來顯示數據,數據有些來自MySQL的表中(多張不同的表),并且有些數據并不是從MySQL取
可以采用Stacked Layouts分頁布局,具體實現代碼如下,望采納:
//創建QWidget類的一個對象pWidget
QWidget *pWidget = new QWidget;
//創建一個布局管理器類 layout
QHBoxLayout *manLayout = new QHBoxLayout;
//左邊的列表控件
QListWidget *listWidget = new QListWidget(pWidget);
listWidget->addItem(QObject::tr("外觀設置"));
listWidget->addItem(QObject::tr("網頁瀏覽"));
...
qt怎樣創建數據庫以及數據庫的操作
qt可以實現連接各種數據庫,這里介紹qt自帶的一種數據庫(Qsqlite)
#include<QSqlQuery>
#include<QObject>
#include<QVariantList>
#include<QDebug>
#include<QSqlError>
#include<QTextCodec>
#include<QObject>
staticboolcreateConnection()
{QSqlDatabasedb=QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("mytest.db");
if(!db.open())
returnfalse;
QSqlQueryquery;
//query.exec(QObject::tr("createtablestudent(idintprimarykey,namevchar)"));
//query.exec(QObject::tr("insertintostudentvalues(0,'劉')"));
////query.exec(QObject::tr("insertintostudentvalues(1,'剛')"));
//query.exec(QObject::tr("insertintostudentvalues(2,'紅')"));
//query.prepare("insertintostudentvalues(?,?)");
//-------------------------------------------------------
//通過下面這段代碼可以實現向數據庫插入變量
//--------------------------------------------------------
QVariantListages;
intx1,x2,x3,x4;
x1=12;
x2=13;
x3=14;
x4=15;
ages<<x1<<x2<<x3<<x4;
query.addBindValue(ages);
QVariantListnames;
names<<QObject::tr("小王")<<QObject::tr("小明")<<QObject::tr("小張")<<QObject::tr("小新");//如果要提交空串,用QVariant(QVariant::String)代替名字
query.addBindValue(names);
if(!query.execBatch())//進行批處理,如果出錯就輸出錯誤
qDebug()<<query.lastError();
returntrue;
}
#endif//DATABASE_H
然后用QSqlTableModel實現數據庫數據顯示
相關推薦:
最高額保證法律依據(民法典后保證最高額擔保的規定)
中外合資經營企業的資本(中外合資企業注冊資本金要求)
車輛抵押貸款(汽車抵押貸款需要什么條件)
國有企業設立的資料(國有企業注冊條件)
怎么注冊公司流程(公司注冊流程及需要的材料)