導航:首頁 > 網路數據 > qtqtableview載入大數據量

qtqtableview載入大數據量

發布時間:2022-01-20 23:35:46

⑴ 如何優化QTableView的性能

1、手動設置定長的表頭數據。比如表頭可能出現的數據是1到100000,那麼我們就以最長的為標准,不夠長度的補空格。這樣不用需要設置自適應,表格刷新和切換可以瞬間完成。但代價是表頭很醜,在數據小時有大片空白2、使用當前最大的表頭數據,僅對該數據用QFontMetrics計算寬度,然後對表頭設置fixedWidth()。這樣理論可行,然而實際很醜陋,調整寬度後多出來的部分只有QWidget底色,文本信息並沒有繪制上去,導致表頭文本顯示不完全,且表頭效果繪制錯誤。然後嘗試搜索了"QTableView VerticalHeader width"關鍵字之後,在Qt論壇搜到一篇帖子,裡面給了一個腦洞清奇的解法——設置表頭寬度後,將首列寬度設置為0,再重置,即代碼如下:ui->tableView->verticalHeader()->setFixedWidth(width);

width = ui->tableView->columnWidth(0);
ui->tableView->setColumnWidth(0, 0);
ui->tableView->setColumnWidth(0, width);
上述代碼,會導致表格布局改變,從而觸發表格的全局重繪,在這次重繪里,重設寬度過後的表頭也能正常顯示了。由於所有column和表頭都沒有設置自適應,所以這個重繪效率很高。最後profile結果如下: - 在設置自適應後,表格刷新耗時10ms內。但若要重新適配表頭,則需要耗時10s左右。 - 關閉自適應,通過手動設置fixedWidth方式適配表頭,數據刷新加適配表頭,總體耗時不超過20ms。

⑵ Qt 如何得到QTableView 列的值

QAbstractItemModel *model = yourTableView->model ();
QModelIndex index = model->index(3,3);
QVariant data = model->data(index);
data可以根據需要轉換為相應的QString,int等等數據類型,具體可以在Qt助手中輸入QVariant 查看。
其實這個model是你自己定義的,在定義這個model的時候你留一個介面,能夠通過行和列獲取你的數據就行了,不一定非要依靠Qt的api。

⑶ 如何使用qstandarditemmodel獲取qtableview中的數據

類QabstractItemModel,QabstractListModel,QAbstractTableModel不保存數據,用戶需要從這些類派生出子類,並在子類中定義某種數據結構來保存數據。與此不同,類QStandardItemModel負責保存數據,每個數據項被表示為類QStandardItem的對象。我們首先闡述如何使用類QStandardItem保存一個數據項,再闡述如何使用類QStandardItemModel將這些數據項組織起來,形成列表、表格或者樹,以供其他視圖類顯示。

理論參考:http://book.51cto.com/art/201207/347880.htm

關鍵是QAbstractItemView.setItemDelegateForColumn函數,可以設置進度條代理。
其中QAbstractItemView的函數特別多,QStandardItem的函數也特別多。

int main( int argc, char **argv )
{
QApplication app( argc, argv );

QTableView table;

QStandardItemModel model( 10, 2 );
for( int r=0; r<10; ++r )
{
QStandardItem *item = new QStandardItem( QString("Row %1").arg(r+1) );
model.setItem( r, 0, item );
model.setItem( r, 1, new QStandardItem( QString::number((r*30)%100 )) );
}

table.setModel( &model ); // 正常設置模型,沒有任何特殊之處

BarDelegate delegate;
table.setItemDelegateForColumn( 1, &delegate ); // 設置第一列為代理
table.show();

return app.exec();
}

除了調用父類構造函數,還要覆蓋兩個純虛函數paint和sizeHint

class BarDelegate : public QAbstractItemDelegate
{
public:
BarDelegate( QObject *parent = 0 );
// 覆蓋兩個函數就可以顯示進度條
void paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const;
QSize sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const;
};

具體每一步的解釋:
BarDelegate::BarDelegate( QObject *parent ) : QAbstractItemDelegate( parent ) { }

void BarDelegate::paint( QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
if( option.state & QStyle::State_Selected )
painter->fillRect( option.rect, option.palette.highlight() );

// 數據是存儲在QStandardItemModel的QStandardItem,會自動根據當前行進行匹配(我認為)
int value = index.model()->data( index, Qt::DisplayRole ).toInt(); // 這句,取得當前行的數據
qDebug() << value;
double factor = double(value)/100.0; // 計算比例因子

painter->save(); // 保存舊畫板(我認為)
// 進度條背景色
if( factor > 0.8 )
{
painter->setBrush( Qt::red ); // 超過0.8畫純紅色
factor = 1;
}
else
painter->setBrush( QColor( 0, int(factor*255), 255-int(factor*255) ) ); // 否則顏色依次變淡

painter->setPen( Qt::black ); // 畫筆顏色(這里沒用到,我認為)
// 前面都是准備工作,這里才是真正畫進度條
painter->drawRect( option.rect.x()+2, option.rect.y()+2, int(factor*(option.rect.width()-5)), option.rect.height()-5 );
painter->restore(); // 恢復新畫板(我認為)
}

QSize BarDelegate::sizeHint( const QStyleOptionViewItem &option, const QModelIndex &index ) const
{
return QSize( 45, 15 ); // 隨便改,不影響(我認為)

⑷ Qt 如何將QTableView的數據保存到資料庫

我的方法是先創建一個表,然後寫語句...
我弄過一個資料庫和tableView聯系,數據可以導出到excel中的程序

⑸ QTQtablewidget 與Qtableview填充數據哪個快

這多數據明顯不可能一次展示在屏幕上,為什麼不做分頁處理呢,一次只顯示二三十條就可以了,需要的時候再翻頁或者無縫翻頁之類都是可以的。

⑹ QT中QTableview表中內容修改

QTableview只是提供視圖功能 具體數據的修改要到model裡面修改

⑺ QT QTableView控制項 實時刷新顯示

不阻塞,只能多線程了,另外開一個線程,當修改數據的線程將所有數據修改完成後給主線程一個信息,主線程刷新顯示。

⑻ QT中的QtableWidget和QtableView使用有什麼區別

QtableWidget 繼承自 QtableView.QtableView 有一個setModel的函數設定model, QtableWidget是用的默認的。
「The QTableWidget class provides an item-based table view with a default model.」
前者更易用,後者可以自定義model的操作,專可以實現屬更靈活的操作,而且modle、view 分開操作,代碼更清晰、更好擴展。
所以,如果數據簡單,用前者,數據復雜、需要操作多,用後者,拿不準就用後者,反正QtableWidget就相當於 view + model。

⑼ QT 如何獲取當前的QTablewidget中的行數!

行的總數是rowCount(),當前選中的行是currentRow()

⑽ QT中QTableView是怎麼實現數字的排序

QTableView::sortByColumn(int column, Qt::SortOrder order);
已經包含了數字排序和字母排序。

閱讀全文

與qtqtableview載入大數據量相關的資料

熱點內容
社死那天我一見鍾情了百度雲 瀏覽:982
如何顯示文件里有多少頁 瀏覽:795
全英文電影免費 瀏覽:346
ioscocoa4app 瀏覽:357
linux上下載文件 瀏覽:766
頭條下載的壓縮文件保存在哪裡 瀏覽:165
安卓系統自帶的編程軟體哪個好 瀏覽:615
很欲的耽美電影 瀏覽:736
一個光頭胖子叫爸爸的電影 瀏覽:514
命令行編譯驅動程序 瀏覽:426
cad標注文件包 瀏覽:368
b2c大數據 瀏覽:232
主角修煉出體內世界的小說 瀏覽:883
許大地網路營銷課程 瀏覽:110
win7電腦c盤哪些文件可以刪除 瀏覽:63
無字幕的網站 瀏覽:914
一部電影日本跟學校有關 瀏覽:595
查詢寧鄉公交用什麼app 瀏覽:371
cms網站模板 瀏覽:456
有什麼電影露奶子 瀏覽:907

友情鏈接