liudianwu |
2022-06-13 09:44 |
Qt开发经验小技巧221-225
221. 在对表格数据模型操作的时候,经常遇到一种场景就是,删除某条记录后,希望重新选中某一行。QTableView、QTableWidget本身就支持多选全选等操作,比如批量删除可以多选。 ```cpp //拿到表格数据模型 QAbstractItemModel *model = ui->tableView->model(); //主动定位到第三行 ui->tableView->setCurrentIndex(model->index(3, 0)); //主动定位到最后一行 ui->tableView->setCurrentIndex(model->index(model->rowCount() - 1, 0));
//设置选择模式支持多选,其他几个枚举值自行查阅文档。 ui->tableView->setSelectionMode(QAbstractItemView::MultiSelection);
//选择全部 ui->tableView->selectAll(); //取消所有选中 ui->tableView->clearSelection();
//选中行,注意如果该行选中则执行后取消选中,如此往复。这个设计很巧妙,掌声。 ui->tableView->selectRow(row); //选中列,注意如果该列选中则执行后取消选中,如此往复。这个设计很巧妙,掌声。 ui->tableView->selectColumn(column);
//获取选中行的内容 QItemSelectionModel *selections = ui->tableView->selectionModel(); QModelIndexList selected = selections->selectedIndexes(); foreach (QModelIndex index, selected) { qDebug() << index.row() << index.column() << index.data(); } ```
222. 在读取文本文件的时候,有时候会发现读取出来的中文乱码,这个时候就需要识别文件编码格式,然后主动设置对应的编码去读取就不会乱码。 ```cpp //检查文件编码 0=ANSI 1=UTF-16LE 2=UTF-16BE 3=UTF-8 4=UTF-8BOM int DataCsv::findCode(const QString &fileName) { //假定默认编码utf8 int code = 3; QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { //读取3字节用于判断 QByteArray buffer = file.read(3); quint8 b1 = buffer.at(0); quint8 b2 = buffer.at(1); quint8 b3 = buffer.at(2); if (b1 == 0xFF && b2 == 0xFE) { code = 1; } else if (b1 == 0xFE && b2 == 0xFF) { code = 2; } else if (b1 == 0xEF && b2 == 0xBB && b3 == 0xBF) { code = 4; } else { //尝试用utf8转换,如果可用字符数大于0,则表示是ansi编码 QTextCodec::ConverterState state; QTextCodec *codec = QTextCodec::codecForName("utf-8"); codec->toUnicode(buffer.constData(), buffer.size(), &state); if (state.invalidChars > 0) { code = 0; } }
file.close(); }
return code; } ```
223. 在连接远程数据库进行查询数据的时候,有时候会发现很慢,尤其是表数据量越多越慢,本地的话同等数据量快很多,可以尝试开启只前进属性,query.setForwardOnly(true);这样的话只会缓存一次的数据,大大提高远程数据库的查询效率,据说可以提高几十倍百倍的速度。当然前提是对查询的数据之前向前取数据的需求,如果还要往后取数据或者在数据模型QSqlQueryModel中使用,则不能开启此属性。原因在每次利用QSqlQuery获取下一条记录时,若不开启isForwardOnly属性(很遗憾默认就是不开启),则每次都开辟新的内存空间,来存储已经访问及未访问的记录,这样,每次都会浪费好多存储空间。
224. Qt中的painter绘制非常灵活强大,接口丰富,但是对于很多初学者来说还是有一定的难度,尤其是各种奇奇怪怪的复杂格式,而这些格式用html确很好描述,比如控制行间距、字符间距等,此时可以用QTextDocument传入html格式内容交给QPainter绘制,非常完美、简单、强大,包括一些数学公式啥的。 ```cpp void Form::paintEvent(QPaintEvent *event) { QPainter painter(this); QTextDocument doc; doc.setHtml(html); //设置文本宽度 doc.setTextWidth(200); //指定绘制区域 doc.drawContents(&painter, QRect(0, 0, 200, 70)); } ```
225. Qt中样式表对选中颜色和悬停颜色是有优先级的,根据对操作系统默认样式的观察,当处于选中状态+悬停状态的时候,默认取悬停状态,也就是鼠标移动到选中的列表item上,颜色取悬停状态颜色。而Qt中如果两种颜色都设置了,根据设置的顺序来,取最后的为准,如果最后设置的选中状态颜色,则当item处于选中状态+悬停状态的时候,取选中状态颜色而不是悬停状态颜色,切记! ```cpp //下面这样设置则当鼠标停留在选中的item上时背景颜色=#00FF00 QTableView::item:selected{background:#FF0000;} QTableView::item:hover{background:#00FF00;}
//下面这样设置则当鼠标停留在选中的item上时背景颜色=#FF0000 QTableView::item:hover{background:#00FF00;} QTableView::item:selected{background:#FF0000;} ``` |
|