zoukankan      html  css  js  c++  java
  • Qt开发经验小技巧176-180

    1. QCamera中获取设备的配置参数比如支持的分辨率集合等,需要先调用load后才能正确获取,或者关联stateChanged信号中判断状态是否是ActiveState,然后再读取。
    //方法1:调用load后获取
    camera = new QCamera(this);
    //先需要载入才能获取到对应参数
    camera->load();
    //输出当前设备支持的分辨率
    QList<QSize> sizes = camera->supportedViewfinderResolutions();
    emit resolutions(sizes);
    //重新设置分辨率
    QCameraViewfinderSettings set;
    set.setResolution(cameraWidth, cameraHeight);
    camera->setViewfinderSettings(set);
    //获取完成后卸载
    camera->unload();
    
    //方法2:通过事件信号获取
    camera = new QCamera(this);
    connect(camera, SIGNAL(stateChanged(QCamera::State)), this, SLOT(stateChanged(QCamera::State)));
    void CameraThread::stateChanged(QCamera::State state)
    {
        if (state == QCamera::ActiveState) {
            //输出当前设备支持的分辨率
            QList<QSize> sizes = camera->supportedViewfinderResolutions();
            emit resolutions(sizes);
            //重新设置分辨率
            QCameraViewfinderSettings set;
            set.setResolution(cameraWidth, cameraHeight);
            camera->setViewfinderSettings(set);
        }
    }
    
    //QCamera没有指定设备名称的时候则采用默认的摄像机
    camera = new QCamera(this);
    //cameraName = @device:pnp:\\?\usb#vid_046d&pid_0825&mi_00#6&212eebd3&0&0000#{65e8773d-8f56-11d0-a3b9-00a0c9223196}\global
    //可以通过设备描述符来查找设备名称(唯一标识)
    camera = new QCamera(cameraName.toUtf8(), this);
    
    1. 很多时候需要在窗体首次显示的时候加载一些东西,而且只加载一次,当窗体再次显示的时候不加载。为什么不是在构造函数呢?因为很多玩意都是要在显示后才能确定,比如控件的尺寸,部分样式表的应用。
    void Widget::showEvent(QShowEvent *)
    {
        static bool isLoad = false;
        if (!isLoad) {
            isLoad = true;
            //执行对应的处理
        }
    }
    
    1. Qt获取当前所用的Qt版本、编译器、位数等信息。
    //详细的Qt版本+编译器+位数
    QString compilerString = "<unknown>";
    {
    #if defined(Q_CC_CLANG)
        QString isAppleString;
    #if defined(__apple_build_version__)
        isAppleString = QLatin1String(" (Apple)");
    #endif
        compilerString = QLatin1String("Clang ") + QString::number(__clang_major__) + QLatin1Char('.') + QString::number(__clang_minor__) + isAppleString;
    #elif defined(Q_CC_GNU)
        compilerString = QLatin1String("GCC ") + QLatin1String(__VERSION__);
    #elif defined(Q_CC_MSVC)
        if (_MSC_VER > 1999) {
            compilerString = QLatin1String("MSVC <unknown>");
        } else if (_MSC_VER >= 1920) {
            compilerString = QLatin1String("MSVC 2019");
        } else if (_MSC_VER >= 1910) {
            compilerString = QLatin1String("MSVC 2017");
        } else if (_MSC_VER >= 1900) {
            compilerString = QLatin1String("MSVC 2015");
        } else if (_MSC_VER >= 1800) {
            compilerString = QLatin1String("MSVC 2013");
        } else if (_MSC_VER >= 1700) {
            compilerString = QLatin1String("MSVC 2012");
        } else if (_MSC_VER >= 1600) {
            compilerString = QLatin1String("MSVC 2010");
        } else {
            compilerString = QLatin1String("MSVC <old>");
        }
    #endif
    }
    
    //拓展知识 查看 QSysInfo 类下面有很多好东西
    // qVersion() = QT_VERSION_STR
    QString version = QString("%1 %2 %3").arg(qVersion()).arg(compilerString).arg(QString::number(QSysInfo::WordSize));
    
    1. QDateTime可以直接格式化输出星期几周几,Qt6默认按照英文输出比如 ddd = 周二 Tue dddd = 星期二 Tuesday ,此时如果只想永远是中文就需要用到QLocale进行转换。
    //格式化输出受到本地操作系统语言的影响
    
    //英文操作系统
    //这样获取到的是Mon到Sun,英文星期的3个字母的缩写。
    QDateTime::currentDateTime().toString("ddd");
    //这样获取到的是Monday到Sunday,英文星期完整单词。
    QDateTime::currentDateTime().toString("dddd");
    
    //中文操作系统
    //这样获取到的是周一到周日。
    QDateTime::currentDateTime().toString("ddd");
    //这样获取到的是星期一到星期日。
    QDateTime::currentDateTime().toString("dddd");
    
    //主动指定语言转换
    //如果没有指定本地语言则默认采用系统的语言环境。
    QLocale locale;
    //QLocale locale = QLocale::Chinese;
    //QLocale locale = QLocale::English;
    //QLocale locale = QLocale::Japanese;
    
    //下面永远输出中文的周一到周日
    locale.toString(QDateTime::currentDateTime(), "ddd");
    //下面永远输出中文的星期一到星期日
    locale.toString(QDateTime::currentDateTime(), "dddd");
    
    1. QSqlTableModel大大简化了对数据库表的显示、添加、删除、修改等,唯独对数据库分页操作有点绕弯。
    //实例化数据库表模型
    QSqlTableModel *model = new QSqlTableModel(this);
    //指定表名
    model->setTable("table");
    //设置列排序
    model->setSort(0, Qt::AscendingOrder);
    //设置提交模式
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    //立即查询一次
    model->select();
    //将数据库表模型设置到表格上
    ui->tableView->setModel(model);
    
    //测试发现过滤条件中除了可以带where语句还可以带排序及limit等
    model->setFilter("1=1 order by id desc limit 100");
    
    //如果在过滤条件中设置了排序语句则不可以再使用setSort方法
    //下面的代码结果是执行出错,可能因为setSort又重新增加了order by语句导致多个order by语句冲突了。
    model->setSort(0, Qt::AscendingOrder);
    model->setFilter("1=1 order by id desc limit 100");
    
    //通过setFilter设置单纯的where语句可以不用加1=1
    model->setFilter("name='张三'");
    //如果还有其他语句比如排序或者limit等则需要最前面加上1=1
    //下面表示按照id升序排序,查询结果显示第5-15条记录。
    model->setFilter("1=1 order by id asc limit 5,10");
    
    //多个条件用and连接
    //建议任何时候用了setFilter则最前面写1=1最末尾加上 ; 防止有些地方无法正确执行。
    model->setFilter("1=1 and name='张三' and result>=70;");
    
    //下面表示查询姓名是张三的记录,按照id字段降序排序,结果从第10条开始100条,相当于从第10条到110条记录。
    model->setFilter("1=1 and name='张三' order by id desc limit 10,100;");
    
    //在第3行开始添加一条记录
    model->insertRow(2);
    //立即填充刚刚新增加的行,默认为空需要用户手动在表格中输入。
    model->setData(model->index(2, 0), 100);
    model->setData(model->index(2, 1), "张三");
    //提交更新
    model->submitAll();
    
    //删除第4行
    model->removeRow(3);
    model->submitAll();
    
    //总之有增删改操作后都需要调用model->submitAll();来真正执行,否则仅仅是数据模型更新了数据,并不会更新到数据库中。
    
    //撤销更改
    model->revertAll();
    
  • 相关阅读:
    sql中table用法
    sql group by
    C#excel导入
    手写简单JDBC
    连接池+事务
    mysql+jdbc
    mysql(多表)
    jsp标签+jstl
    页面跳转+路径问题
    ajax 动态获取数据库中的值
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/15379553.html
Copyright © 2011-2022 走看看