- 在对表格数据模型操作的时候,经常遇到一种场景就是,删除某条记录后,希望重新选中某一行。QTableView、QTableWidget本身就支持多选全选等操作,比如批量删除可以多选。
//拿到表格数据模型
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();
}
- 在读取文本文件的时候,有时候会发现读取出来的中文乱码,这个时候就需要识别文件编码格式,然后主动设置对应的编码去读取就不会乱码。
//检查文件编码 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;
}
-
在连接远程数据库进行查询数据的时候,有时候会发现很慢,尤其是表数据量越多越慢,本地的话同等数据量快很多,可以尝试开启只前进属性,query.setForwardOnly(true);这样的话只会缓存一次的数据,大大提高远程数据库的查询效率,据说可以提高几十倍百倍的速度。当然前提是对查询的数据之前向前取数据的需求,如果还要往后取数据或者在数据模型QSqlQueryModel中使用,则不能开启此属性。原因在每次利用QSqlQuery获取下一条记录时,若不开启isForwardOnly属性(很遗憾默认就是不开启),则每次都开辟新的内存空间,来存储已经访问及未访问的记录,这样,每次都会浪费好多存储空间。
-
Qt中的painter绘制非常灵活强大,接口丰富,但是对于很多初学者来说还是有一定的难度,尤其是各种奇奇怪怪的复杂格式,而这些格式用html确很好描述,比如控制行间距、字符间距等,此时可以用QTextDocument传入html格式内容交给QPainter绘制,非常完美、简单、强大,包括一些数学公式啥的。
void Form::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
QTextDocument doc;
doc.setHtml(html);
//设置文本宽度
doc.setTextWidth(200);
//指定绘制区域
doc.drawContents(&painter, QRect(0, 0, 200, 70));
}
- Qt中样式表对选中颜色和悬停颜色是有优先级的,根据对操作系统默认样式的观察,当处于选中状态+悬停状态的时候,默认取悬停状态,也就是鼠标移动到选中的列表item上,颜色取悬停状态颜色。而Qt中如果两种颜色都设置了,根据设置的顺序来,取最后的为准,如果最后设置的选中状态颜色,则当item处于选中状态+悬停状态的时候,取选中状态颜色而不是悬停状态颜色,切记!
//下面这样设置则当鼠标停留在选中的item上时背景颜色=#00FF00
QTableView::item:selected{background:#FF0000;}
QTableView::item:hover{background:#00FF00;}
//下面这样设置则当鼠标停留在选中的item上时背景颜色=#FF0000
QTableView::item:hover{background:#00FF00;}
QTableView::item:selected{background:#FF0000;}