QT相关积累

前言

qt安装

  1. linux下默认安装
    qt4
    sudo apt install install qt4-dev-tools 开发包
    sudo apt install install qtcreator IDE
    sudo apt install install qt4-doc 开发文档
    sudo apt install install qt4-qtconfig 配置工具
    qt5
    sudo apt install qt5-default
    sudo apt install qt5-qmake

1.多语言设置

开发环境:vs2015 + Qt

  1. Qt VS Tools->Create new translation file->产生*.ts文件(在工程Translation Files目录下,根据需要产生不同语言包)
  2. 选中*.ts文件,右键->lupdate->双击打开->翻译语言包
  3. 选中*.ts文件,右键->lrelease->产生*.qm文件
	static QTranslator translator;
	int nLangType = _othersSettings.getLanguage();
	if (nLangType == 0)
	{
		translator.load("./thzterminal_zh.qm");
	}
	else if(nLangType == 1)
	{ 
		translator.load("./thzterminal_HK.qm");
	}
	else if (nLangType == 2)
	{
		translator.load("./thzterminal_ru.qm");
	}
	else
	{
		// 默认英语
	}
	this->installTranslator(&translator);

  注意:最好默认语言使用英语,其他语言使用语言包翻译,方便管理。代码中需要替换的语言需要写成:QObject::tr("language"),若前面已声明Q_OBJECT,则可以直接使用tr("language")

2.QQueue使用

   QQueue本身没有长度的限制,使用时注意。在工程中如果不添加长度限制,可能会导致内存异常。

	m_mutexSerialize.lock();
	m_queueDataContent.enqueue(QDataContent(file));
	if (m_queueDataContent.size() > m_nQueueSizeMax)
	{
		QDataContent data = m_queueDataContent.dequeue();
	}
	m_mutexSerialize.unlock();

3.detach的使用

  涉及类:
  QPixmap Class
  QPixmap Class
  QSharedDataPointer Class
  QSharedMemory Class

  对于QPixmap类,内部使用cache(载入同一路径的同一文件,下次直接从cache中获取)和隐式共享两种技术,在使用图像拷贝时,图像拷贝后记得image.detach()释放共享缓存,否则后续不能对拷贝后的图像对象进行操作。

  附上,马赛克函数中,图像拷贝时使用的detach操作

void mosaic(QImage& image, const QRect& region, const int size)
{
	tcom::Q2DArray<unsigned char> temp(image.height(), image.width()*image.depth() / 8);
	memcpy(temp.buffer(), image.bits(), sizeof(unsigned char)*image.width()*image.height()*image.depth() / 8);

	// 选择size*size像素区域的第一个像素
	int b, g, r, a;
	for (int row = region.top(); row < region.top() + region.height();)
	{
		for (int col = region.left(); col < region.left() + region.width();)
		{
			if ((row - region.top()) % size == 0 && (col - region.left()) % size == 0)
			{
				b = temp[row][col * image.depth() / 8];
				g = temp[row][col * image.depth() / 8 + 1];
				r = temp[row][col * image.depth() / 8 + 2];
				a = temp[row][col * image.depth() / 8 + 3];
				for (int i = 0; i < size; ++i)
				{
					for (int j = 0; j < size; ++j)
					{
						temp[row + i][(col + j) * image.depth() / 8] = b;
						temp[row + i][(col + j) * image.depth() / 8 + 1] = g;
						temp[row + i][(col + j) * image.depth() / 8 + 2] = r;
						temp[row + i][(col + j) * image.depth() / 8 + 3] = a;
					}
				}		
			}
			col += size;
		}
		row += size;
	}
	QImage outImage(temp.buffer(), image.width(), image.height(), QImage::Format_ARGB32);

	image = outImage;
	image.detach();
}

4.QAtomicInt

  多线程共享变量,可能会存储在寄存器中,不能及时得到更新,需要使用QAtomicInt,将变量保存在内存中,方便及时更新,不至于共享变量已改变,但是寄存器中的变量还没来得及改变,以致程序运行不能达到预期效果。
  对于多线程间的互斥资源,使用QMutex.

5.QImage与QPixmap

  QPixmapQpaintDevice类,硬件相关,存储在graphics memory中

	QPixmap canvas(rect().width(), rect().height());
	QPainter mem(&canvas);
	
	// Qt自带双缓存,此处可以不使用QPixmap(这里相当于增加了一次缓存)
	QPainter painter(this);
	painter.drawPixmap(0, 0, canvas);

  QImage:图片像素级访问,QpaintDevice

	painter.drawImage(QRct(0, 0, 148, 408), image);

  QPicture:基类为QPixmapQpaintDevice类,图像深度为1
  QBitmap:基类为QPixmap,提供单色图像

  附加
  QPen
  QBrush

6.QImage数据处理

  数据读取,数据处理,数据写入

// 方法一
int image2Data(const QImage & image, unsigned char * data, const QString& format, int quality)
{
	QByteArray byteArray;
	QBuffer buffer(&byteArray);
	buffer.open(QIODevice::WriteOnly);
	image.save(&buffer, format.toStdString().c_str(), quality);
	memcpy(data, byteArray.data(), byteArray.size());
	return byteArray.size();
}

// 方法二

# 7.图像处理
## 7.1 QPinter对QPixmap图像拼接、覆盖、写文字
### 7.1.1 一张图片绘制在另一张图片上
```cpp
	QPainter painter(&p1);
    painter.drawPixmap(0,0,p2.width(),p2.height(), p2);

8.图像黑点

  像素级操作图像后,显示图像经常出现极黑的像素点。原因可能有二:
  1.若在全是偏白区域中出现黑点,很可能是像素值计算时越界,导致归一化时发生取反的操作;
  2.出现干扰性像素值,增加了整幅图像的像素值范围。

void gradation(tcom::Q2DArray<unsigned char>& image, const QImagePreTreatParams & params)
{
	// 获取数据中的最大灰度值,并统计灰度直方图
	memset(m_arrayBuffer2.buffer(), 0x00, 256 * sizeof(int));

	for (int i = 0; i < image.size(); i++)
	{
		m_arrayBuffer2(image(i))++;
	}

	int beginAmount = image.size() * params.gradataionCutBegin() / 1000;
	int endAmount = image.size() * params.gradationCutEnd() / 1000;

	unsigned char beginThreshold = 0;
	unsigned char endThreshold = 255;
	// 按比例获取最暗的部分的阈值
	int sum = 0;

	for (int i = 0; i < 256; i++)
	{
		sum += m_arrayBuffer2(i);

		if (sum > beginAmount)
		{
			beginThreshold = i;
			break;
		}
	}
	// 按比例获取最亮的部分的阈值
	sum = 0;
	for (int i = 255; i >= 0; i--)
	{
		sum += m_arrayBuffer2(i);

		if (sum > endAmount)
		{
			endThreshold = i;
			break;
		}
	}
	// 按阈值将图像重新映射到0~255范围内
	if (beginThreshold != endThreshold)
	{
		for (int i = 0; i < image.size(); i++)
		{
			if (image(i) <= beginThreshold)
			{
				image(i) = 0;
			}
			else if (image(i) >= endThreshold)
			{
				image(i) = 255;
			}
			else
			{
				image(i) = 255 * (image(i) - beginThreshold) / (endThreshold - beginThreshold);
			}
		}
	}
	else
	{
		for (int i = 0; i < image.size(); i++)
		{
			image(i) = endThreshold;
		}
	}
}

9.伪彩图

  opencv提供了12种伪彩色COLORMAP_*
applyColorMap:COLORMAP_BONE, COLORMAP_JET, COLORMAP_RAINBOW, COLORMAP_SUMEER...

  matlab中提供了colormap伪彩图18种
colormap:jet, hsv, hot...

  C++实现jet

void setColor(QImage& image, unsigned char max, unsigned char min)
{
	const int size = 42;
	double posSlope = (max - min) / size;
	double negSlope = (min - max) / size;
	
	for (int i = 0; i < 256; ++i)
	{
		QRgb rgb = 0xFF000000;

		if (i < size)
		{	
			unsigned char g = static_cast<unsigned char>(round(posSlope * i + min)) ;
			rgb += static_cast<QRgb>((max << 16) + (g << 8) + min);
		}
		else if (i < size *2)
		{
			unsigned char r = static_cast<unsigned char>(round(negSlope*i + 2 * max + min));
			rgb += static_cast<QRgb>((r << 16) + max << 8 + min);
		}
		else if (i < size*3)
		{
			unsigned char b = static_cast<unsigned char>(round(posSlope*i - 2 * max + min));
			rgb += static_cast<QRgb>(min << 16 + max << 8 + b);
		}
		else if (i < size*4)
		{
			unsigned char g = static_cast<unsigned char>(round(negSlope * i + 4*max + min));
			rgb += static_cast<QRgb>((max << 16) + (g << 8) + min);
		}
		else if (i < size *5)
		{
			unsigned char r = static_cast<unsigned char>(round(posSlope*i - 4 * max + min));
			rgb += static_cast<QRgb>((r << 16) + max << 8 + min);
		}
		else
		{
			unsigned char b = static_cast<unsigned char>(round(negSlope*i + 6 * max));
			rgb += static_cast<QRgb>(min << 16 + max << 8 + b);
		}

		image.setColor(i, rgb);

	}
}

10. linux(QtCreator)与window(VS2015)注意事项

  1. include引用时,QtCreator下路径使用“/”,框架路径放在前列(方便排错),区分大小写;
  2. 注意__super之类(vc ++扩展)的使用,完全可以用基类类型名替代;
  3. 文件格式编码,最好统一成UTF-8格式,否则会出现奇怪的乱码;
  4. 图片格式错误:libpng warning: iCCP: know incorrect sRGB profile
    处理方法(修改格式):
    from PyQt5.QtGui import *
    import os
     
    img = QImage()
    path = "./img"
    for root , dirs, files in os.walk(path):
        for name in files:
            print(name)
            if name.endswith(".png"):
                print(name)
                print("./img/"+ name)
                img.load("./img/"+name)
                img.save("./img/"+name)
    

11. QUuid去括号

在5.11版本前,使用Quuid::createUuid().toString().remove("{").remove("}");
之后可以使用Quuid::createUuid().toString(QUuid::WithBraces);

12.QApplication

参数传值方式应该为引用,否则会报内存出错std::bad_alloc
参数列表应该为(int &argc, char **argv)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Qt面试中,coding环节通常是测试应聘者Qt编程技能和经验的重要部分。对于Qt面试的coding部分,可能会涉及以下几个方面: 1. Qt基础知识:应聘者需要掌握Qt的基本概念和常用类,了解Qt的对象模型和信号槽机制。可能会出现一些关于Qt类的使用和常见操作的问题。 2. UI设计与开发:这部分可能会要求应聘者根据一些需求或UI设计稿实现一个界面。应聘者需要使用Qt的UI设计工具,例如Qt Designer,完成界面的设计和布局,并用C++代码实现界面的功能。 3. 数据处理与算法:有时候面试官会出一些与数据处理或算法有关的问题,以考察应聘者对Qt的灵活运用能力。例如,要求实现一个基于Qt的文本编辑器,或者对一组数据进行排序等。 4. 多线程编程:对于需要处理并发或耗时操作的问题,可能会考察应聘者的多线程编程能力。这包括使用Qt提供的多线程类或库函数,以及保证线程安全性和避免资源竞争的经验。 5. 调试与问题解决能力:面试过程中可能会有意设置一些错误或问题,观察应聘者的调试和解决问题的能力。应聘者需要能够熟练使用Qt的调试工具,查找和修复代码中的问题和错误。 在Qt面试的coding环节中,关键是熟练掌握Qt的基本特性和常用类,以及对数据处理、UI设计、多线程和问题解决的经验和能力。同时,良好的编码风格和规范也是考察的一项重点。通过练习和实际项目的积累,不断提升自己的Qt编程技能,才能在Qt面试中有较好的表现。 ### 回答2: QT面试coding主要是针对QT编程技能的考察。在QT面试coding过程中,通常会给出一些编程问题或者需要完成一些编程任务。 首先,面试官可能会问一些基础的QT问题,例如QT的信号与槽机制、布局管理器、窗口部件等等。回答这些问题需要我们对QT相关概念有一定的了解和掌握。 其次,面试官可能会给出一些具体的编程问题,要求我们使用QT进行解答。这些问题可能涉及到QT的各种功能和模块,例如窗口的绘制、界面的响应事件、文件的读写等。在解答这些问题时,我们需要灵活运用QT相关函数和类进行编程实现。 最后,面试官可能会要求我们完成一些编程任务,例如实现一个简单的QT应用程序、设计一个界面等等。在这些任务中,我们需要运用QT的各种功能和UI设计技巧来完成。 总的来说,QT面试coding主要考察我们对QT编程的熟练程度和实际应用能力。我们需要熟悉QT相关知识,并能够灵活运用QT进行编程。通过在面试中展示我们的编程能力,我们能够更好地展现自己的优势,提高获得工作机会的几率。 ### 回答3: 在qt面试的coding环节中,通常会要求应聘者完成一个具体的编程任务来评估其在qt开发方面的能力。 首先,面试官可能会询问应聘者是否有qt编程经验以及相关项目经验。这些问题旨在了解应聘者是否熟悉qt框架,是否能够独立开发qt应用程序,并根据具体需求进行调试和优化。 接下来,面试官可能会给应聘者一个具体的编程问题,要求应聘者使用qt编写代码解决该问题。这个问题可能涉及到窗口和控件的创建、布局、信号与槽的连接、界面交互等方面。 在解决问题的过程中,应聘者需要熟悉qt的基本概念和常用的类,比如QWidget、QBoxLayout、QPushButton、QLineEdit等。同时,还需要掌握qt的常用功能,比如事件处理、界面设计和绘图等。 应聘者需要根据问题的要求编写代码,并确保代码的可读性、可维护性和效率。在编程过程中,应聘者需要熟练运用qt的API,同时遵循良好的编码规范,确保代码的质量。 此外,应聘者还可以采取一些额外的措施来提高代码的质量和可扩展性,比如使用设计模式、封装可复用的代码、添加注释和文档等。 最后,面试官可能会与应聘者讨论和评价其代码的质量和实现细节。这个过程中,应聘者需要清楚地解释和展示自己的代码实现,并回答面试官的问题和疑问。 在qt面试的coding环节中,关键是理解问题、熟练使用qt的API和功能,并能够用清晰、简洁、高效的代码解决问题。同时,代码的可读性和可维护性也是重要的考察因素。通过合理的思考和实现,展示自己在qt开发方面的能力和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值