当前位置: 首页 > ops >正文

Qt开发经验 --- 避坑指南(6)

文章目录

    • @[toc]
      • 1 QByteArray转16进制字符串
      • 2 获取本机IP地址
      • 3 Qt缩放图片效率比较
      • 4 Qt模态窗口
      • 5 指针地址转QString

更多精彩内容
👉内容导航 👈
👉Qt开发经验 👈

1 QByteArray转16进制字符串

QString str = "123你好";
QString value = str.toUtf8().toHex(' ');             // 转换为16进制字符串,以空格分隔 value=31 32 33 e4 bd a0 e5 a5 bd
QString value = QByteArray::fromHex(value.toUtf8()); // 还原 value=123你好

2 获取本机IP地址

QString getLocalIP()
{QHostInfo info = QHostInfo::fromName(QHostInfo::localHostName());for(auto address : info.addresses()){if(address.protocol() == QAbstractSocket::IPv4Protocol){return address.toString();}}return "0.0.0.0";
}

3 Qt缩放图片效率比较

  • 在Qt里常用的图片显示方式一般是QLabel、QPainter、OpenGL,但是QLabel效率低,OpenGL使用麻烦,不适合初学者,所以一般我们都是使用QPainter绘制图片;
  • 而图片显示会遇见图片缩放问题,这就需要用到QPixmap或者QImage自带的scaled函数了,同时考虑到效率问题,我们也需要将图片转换为QPixmap进行显示,这里就比较了一下两种使用方式的效率;
    • 方式一:先将QImage图片进行缩放,然后转换为QPixmap图片;
    • 方式二:先将QImage图片转换为QPixmap图片,再进行缩放。
/*** @brief        使用Qpainter显示图片* @param event*/
void PlayImage::paintEvent(QPaintEvent *event)
{if(!m_image.isNull()){QPainter painter(this);QElapsedTimer timer;timer.start();
#if 1// 经过粗略测试,QImage先缩放后转为QPixmap的方式在图像比较小时耗时少,图片越大耗时远大QPixmap pixmap = QPixmap::fromImage(m_image.scaled(this->size(), Qt::KeepAspectRatio));qint64 t1 = timer.elapsed();timer.start();// 先将QImage转换为QPixmap再进行缩放则耗时比较少,并且稳定,不会因为缩放图片大小而产生太大影响QPixmap pixmap1 = QPixmap::fromImage(m_image).scaled(this->size(), Qt::KeepAspectRatio);
#endifqDebug() << t1 << "  " << timer.elapsed() <<"  "<< this->size();int x = (this->width() - pixmap.width()) / 2;int y = (this->height() - pixmap.height()) / 2;painter.drawPixmap(x, y, pixmap);}QWidget::paintEvent(event);
}
  • 测试方式:保持窗口高度不变,改变窗口宽度,打印两种方式的耗时;

  • 测试结果:方式二效率普遍高于方式1,并且比较稳定。

    在这里插入图片描述

4 Qt模态窗口

  • Widget模态(弹窗)

    • 方法一:属性设置

      QWidget* w = new QWidget();                 // 注意不能指定父对象,否则模态无效
      w->setAttribute(Qt::WA_ShowModal, true);    // 必须放在show前
      w->show();
      
    • 方法二:设置阻塞类型

      QWidget* w = new QWidget();                    // 注意不能指定父对象,否则模态无效
      w->setWindowModality(Qt::ApplicationModal);    // 必须放在show前
      w->show();
      
  • 前两种方法都不能指定父对象,如果指定了父对象,想要除了当前控件外所有控件都不可用则需要使用下列方法(第一时间想到的是this->setEnabled(false),但是这种方法会把父对象和所有子对象全部失能);

    QList<QWidget *> widgets = this->findChildren<QWidget *>();
    for(auto widget: widgets)
    {widget->setEnabled(false);             
    }
    QPushButton* w = new QPushButton("button", this);
    w->show();
    

5 指针地址转QString

  • 通常我们通过qDebug可以直接打印指针地址,但是想把指针地址转换为QString要怎么做呢,可以通过QString自带的arg函数转换;

    uchar* buf;
    QString("buf地址:0x%1").arg(quint64(buf), 0, 16)
    


http://www.xdnf.cn/news/4505.html

相关文章:

  • Android接入国标平台:工业现场级的GB28181移动端接入实践
  • ps信息显示不全
  • 【纯小白博客搭建】Hugo+Github博客部署及主题(stack)美化等界面优化记录
  • 基于STM32、HAL库的ZMOD4410AI1R 气体传感器驱动程序设计
  • qwen2.5vl
  • 考研数据结构之树形查找:二叉排序树、平衡二叉树与红黑树(包含真题解析)
  • 使用 Couchbase Analytics Service 的典型步骤
  • 【面板数据】公开整理-各省刑事案件统计数据集(2011-2023年)
  • Java01-初识Java
  • C 语言 第六章 结构体(1)
  • 短词匹配:拼音相似度
  • LeetCode热题100--73.矩阵置零--中等
  • C语言初阶--数组
  • GSENSE2020BSI sCMOS科学级相机主要参数及应用场景
  • 探针卡的类型及其在半导体测试中的应用
  • Java高频面试之并发编程-13
  • 奥威BI:AI驱动的智能财务分析革新,重塑企业决策新范式
  • 深入探索 Spark RDD 行动算子:功能解析与实战应用
  • Python基础语法(上)
  • 从图灵机到量子计算:逻辑可视化的终极进化
  • 基于C++实现(控制台)交通咨询系统
  • C语言指针用法详解
  • 切片和边缘计算技术分析报告
  • 【今日三题】跳台阶扩展问题(找规律) / 包含不超过两种字符的最长子串 / 字符串的排列(回溯—全排列)
  • 架设手游使用游戏盾SDK怎么提升网络速度?
  • 【ROS2】Nav2源码之行为树定义、创建、加载
  • 六级阅读———2024.12卷一 仔细阅读2
  • 城楼预约(二):参数逆向分析思路
  • 挑战用豆包教我学Java01天
  • 单地平面6层PCB设计实战:如何兼顾电源与信号完整性?