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

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)
    


相关文章:

  • Java中字符转数字的原理解析 - 为什么char x - ‘0‘能得到对应数字
  • C++回顾 Day4
  • Web前端入门及基础代码
  • 创建虚拟服务时实现持久连接。
  • hadoop中的序列化和反序列化(1)
  • 猫咪如厕检测与分类识别系统系列~进阶【一】视频流推流及网页实时展示
  • 如何测试 esp-webrtc-solution_solutions_doorbell_demo 例程?
  • 【Python】通过`Editable Install`模式详解,解决Python开发总是import出错的问题
  • 电商双11美妆数据分析(二)
  • Python案例实战《水果识别模型训练及调用》
  • 写个远程操作Android的调试程序
  • OpenMVS 的编译与运行
  • 电子电器架构 --- 48V架构的一丢丢事情
  • 2014年写的一个文档《基于大数据应用的综合健康服务平台研发及应用示范》
  • 【性能工具】一种简易hook bitmap创建的插件使用
  • 单片机-STM32部分:7、GPIO输入 按键
  • 二分查找习题
  • 默认成员函数移动构造和移动赋值运算符重载
  • 数 学 函数
  • 双11美妆数据分析
  • 普雷沃斯特当选新一任天主教罗马教皇
  • 外卖员投资失败负疚离家流浪,经民警劝回后泣不成声给父母下跪
  • 中消协点名新能源汽车行业:定金退款争议频发
  • 万达电影:股东杭州臻希拟减持不超1.3927%公司股份
  • 太原一高中生指出博物馆多件藏品标识不当,馆方已邀请他和专家共同探讨
  • 习近平抵达莫斯科对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典