• Qt开发经验小技巧221225


    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;}
    
  • 相关阅读:
    BZOJ-1206 虚拟内存 Hash+离散化+Priority_Queue
    BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
    BZOJ-1834 网络扩容 最小费用最大流+最大流+乱搞
    学习笔记 --- 最小费用最大流
    BZOJ-1927 星际竞速 最小费用最大流+拆点+不坑建图
    BZOJ-1070 修车 最小费用最大流+拆点+略坑建图
    BZOJ-1207 打鼹鼠 DP(LIS)
    BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论
    BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!
    BZOJ-1822 Frozen Nova 冷冻波 计(jie)算(xi)几何+二分+最大流判定+经典建图
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/16369688.html
Copyright © 2020-2023  润新知