美文网首页
Qt开发经验小技巧221-225

Qt开发经验小技巧221-225

作者: feiyangqingyun | 来源:发表于2022-06-13 09:38 被阅读0次
  1. 在对表格数据模型操作的时候,经常遇到一种场景就是,删除某条记录后,希望重新选中某一行。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();   
}
  1. 在读取文本文件的时候,有时候会发现读取出来的中文乱码,这个时候就需要识别文件编码格式,然后主动设置对应的编码去读取就不会乱码。
//检查文件编码 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;
}
  1. 在连接远程数据库进行查询数据的时候,有时候会发现很慢,尤其是表数据量越多越慢,本地的话同等数据量快很多,可以尝试开启只前进属性,query.setForwardOnly(true);这样的话只会缓存一次的数据,大大提高远程数据库的查询效率,据说可以提高几十倍百倍的速度。当然前提是对查询的数据之前向前取数据的需求,如果还要往后取数据或者在数据模型QSqlQueryModel中使用,则不能开启此属性。原因在每次利用QSqlQuery获取下一条记录时,若不开启isForwardOnly属性(很遗憾默认就是不开启),则每次都开辟新的内存空间,来存储已经访问及未访问的记录,这样,每次都会浪费好多存储空间。

  2. 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));
}
  1. 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;}

相关文章

  • Qt开发经验小技巧221-225

    在对表格数据模型操作的时候,经常遇到一种场景就是,删除某条记录后,希望重新选中某一行。QTableView、QTa...

  • Qt开发经验小技巧91-100

    数据库处理一般建议在主线程,如果非要在其他线程,务必记得打开数据库也要在那个线程,即在那个线程使用数据库就在那个线...

  • Qt开发经验小技巧111-120

    在不同的平台上文件路径的斜杠也是不一样的,比如linux系统一般都是 / 斜杠,而在windows上都是 \ 两个...

  • Qt开发经验小技巧101-110

    如果需要在尺寸改变的时候不重绘窗体,则设置属性即可 this->setAttribute(Qt::WA_Stati...

  • Qt开发经验小技巧121-130

    QLineEdit除了单纯的文本框以外,还可以做很多特殊的处理用途。 限制输入只能输入IP地址。 限制输入范围,强...

  • Qt开发经验小技巧146-150

    Qt中自带的很多控件,其实都是由一堆基础控件(QLabel、QPushButton等)组成的,比如日历面板 QCa...

  • Qt开发经验小技巧131-140

    Qt新版本往往会带来一些头文件的更新,比如以前使用QPainter绘制,不需要额外包含QPainterPath头文...

  • Qt开发经验小技巧141-145

    QImage支持xpm图标,查看Qt内置的QStyle风格的代码中可以发现大量的xpm图标定义,通过代码的形式来产...

  • Qt开发经验小技巧156-160

    Qt的UI界面在resize以后有个BUG,悬停样式没有取消掉,需要主动模拟鼠标动一下。 项目中启用c++11语法...

  • Qt开发经验小技巧151-155

    当Qt中编译资源文件太大时,效率很低,或者需要修改资源文件中的文件比如图片、样式表等,需要重新编译可执行文件,这样...

网友评论

      本文标题:Qt开发经验小技巧221-225

      本文链接:https://www.haomeiwen.com/subject/zvqomrtx.html