Qt-经验技巧及通用类库|Qt开发经验小技巧176-180

  1. QCamera中获取设备的配置参数比如支持的分辨率集合等,需要先调用load后才能正确获取,或者关联stateChanged信号中判断状态是否是ActiveState,然后再读取。
//方法1:调用load后获取 camera = new QCamera(this); //先需要载入才能获取到对应参数 camera->load(); //输出当前设备支持的分辨率 QList 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 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 = ""; {#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 "); } 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 "); } #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();

    推荐阅读