转载的两篇qt 的技巧
来源:互联网 发布:esframework 6.2源码 编辑:程序博客网 时间:2024/04/29 20:25
转载的两篇qt 的技巧
【原创】图片背景透明
void ImageProcess::HLN_showImgInDb(int imgInd)
{
QPixmap pixmap = indList[imgInd].getPixmap();
pixmap.setMask(pixmap.createMaskFromColor(QColor(255, 255, 255)));//设置掩码
pixmap.scale(pixmap.width()*1.5, pixmap.height()*1.5);
ui.dbImgPreview->setPixmap(pixmap);
ui.dbImgRate->display(150);
}
【原创】DLL 导出类的问题
使用DLL的一个比较严重的问题就是编译器之间的兼容性问题。不同的编译器对c++函数在二进制级别的实现方式是不同的。所以对基于C++的DLL,如果编译器不同就有很麻烦的。如果创建的是MFC扩展DLL,就不会存在问题,因为它只能被动态连接到MFC的客户应用程序。这里不是本文讨论的重点。
一、重新编译问题
我们先来看一个在实际中可能遇到的问题:
比如现在建立好了一个DLL导出了CMyClass类,客户也能正常使用这个DLL,假设CMyClass对象的大小为30字节。如果我们需要修改DLL
中的CMyClass类,让它有相同的函数和成员变量,但是给增加了一个私有的成员变量int类型,现在CMyClass对象的大小就是34字节了。当直接把这个新的DLL给客户使用替换掉原来30字节大小的DLL,客户应用程序期望的是30字节大小的对象,而现在却变成了一个34字节大小的对象,糟糕,客户程序出错了。
类似的问题,如果不是导出CMyClass类,而在导出的函数中使用了CMyClass,改变对象的大小仍然会有问题的。这个时候修改这个问题的唯一办法就是替换客户程序中的CMyClass的头文件,全部重新编译整个应用程序,让客户程序使用大小为34字节的对象。
这就是一个严重的问题,有的时候如果没有客户程序的源代码,那么我们就不能使用这个新的DLL了。
二、解决方法
为了能避免重新编译客户程序,这里介绍两个方法:(1)使用接口类。(2)使用创建和销毁类的静态函数。
1、使用接口类
接口类的也就是创建第二个类,它作为要导出类的接口,所以在导出类改变时,也不需要重新编译客户程序,因为接口类没有发生变化。
假设导出的CMyClass类有两个函数FunctionA
FunctionB。现在创建一个接口类CMyInterface,下面就是在DLL中的CMyInterface类的头文件的代码:
# include "MyClass.h"
class _declspec(dllexport) CMyInterface
{
CMyClass *pmyclass;
CMyInterface();
~CMyInterface();
public:
int FunctionA(int);
int FunctionB(int);
};
而在客户程序中的头文件稍不同,不需要INCLUDE语句,因为客户程序没有它的拷贝。相反,使用一个CMyClass的向前声明,即使没有头文件也能编译:
class _declspec(dllexport) CMyInterface
{
class CMyClass;//向前声明
CMyClass *pmyclass;
CMyInterface();
~CMyInterface()%3
原文地址 http://qtcn.org void ImageProcess::HLN_showImgInDb(int imgInd)
{
QPixmap pixmap = indList[imgInd].getPixmap();
pixmap.setMask(pixmap.createMaskFromColor(QColor(255, 255, 255)));//设置掩码
pixmap.scale(pixmap.width()*1.5, pixmap.height()*1.5);
ui.dbImgPreview->setPixmap(pixmap);
ui.dbImgRate->display(150);
}
【原创】DLL 导出类的问题
使用DLL的一个比较严重的问题就是编译器之间的兼容性问题。不同的编译器对c++函数在二进制级别的实现方式是不同的。所以对基于C++的DLL,如果编译器不同就有很麻烦的。如果创建的是MFC扩展DLL,就不会存在问题,因为它只能被动态连接到MFC的客户应用程序。这里不是本文讨论的重点。
一、重新编译问题
我们先来看一个在实际中可能遇到的问题:
比如现在建立好了一个DLL导出了CMyClass类,客户也能正常使用这个DLL,假设CMyClass对象的大小为30字节。如果我们需要修改DLL
中的CMyClass类,让它有相同的函数和成员变量,但是给增加了一个私有的成员变量int类型,现在CMyClass对象的大小就是34字节了。当直接把这个新的DLL给客户使用替换掉原来30字节大小的DLL,客户应用程序期望的是30字节大小的对象,而现在却变成了一个34字节大小的对象,糟糕,客户程序出错了。
类似的问题,如果不是导出CMyClass类,而在导出的函数中使用了CMyClass,改变对象的大小仍然会有问题的。这个时候修改这个问题的唯一办法就是替换客户程序中的CMyClass的头文件,全部重新编译整个应用程序,让客户程序使用大小为34字节的对象。
这就是一个严重的问题,有的时候如果没有客户程序的源代码,那么我们就不能使用这个新的DLL了。
二、解决方法
为了能避免重新编译客户程序,这里介绍两个方法:(1)使用接口类。(2)使用创建和销毁类的静态函数。
1、使用接口类
接口类的也就是创建第二个类,它作为要导出类的接口,所以在导出类改变时,也不需要重新编译客户程序,因为接口类没有发生变化。
假设导出的CMyClass类有两个函数FunctionA
FunctionB。现在创建一个接口类CMyInterface,下面就是在DLL中的CMyInterface类的头文件的代码:
# include "MyClass.h"
class _declspec(dllexport) CMyInterface
{
CMyClass *pmyclass;
CMyInterface();
~CMyInterface();
public:
int FunctionA(int);
int FunctionB(int);
};
而在客户程序中的头文件稍不同,不需要INCLUDE语句,因为客户程序没有它的拷贝。相反,使用一个CMyClass的向前声明,即使没有头文件也能编译:
class _declspec(dllexport) CMyInterface
{
class CMyClass;//向前声明
CMyClass *pmyclass;
CMyInterface();
~CMyInterface()%3
- 转载的两篇qt 的技巧
- 两篇关于Qt && Light House && Wayland的文章转载
- 转载两篇关于程序员的文章
- 转载两篇关于WSGI的文章
- 转载:QT小技巧
- qt的一些技巧
- 转载Qt多线程的理解
- 转载Qt的重要知识
- Qt编程技巧 Qt随机数的产生
- Qt编程技巧 Qt随机数的产生
- 转载的---word操作技巧
- 转载宏的使用技巧
- 转载:PostgreSQL的小技巧
- QT 的一些小技巧
- Qt的一些样式技巧
- Qt的一些样式技巧
- QT窗体的小技巧
- Qt技巧:QSS的应用
- 常见的几个Qt编程问题的处理
- 十个故事
- NCR5887 ATM机出钞时卡钞解决方法-NCR5887常见故障系列一
- 使用 Grails 快速开发 Web 应用程序
- PHP Developer's Cookbook (2nd Edition)
- 转载的两篇qt 的技巧
- Java对于Cookie的操作详解
- Embedded System Design
- What the hell is "锟斤拷"?
- Linux2.6内核usb gadget驱动移植
- Multi-Objective Optimization in Computer Networks Using Metaheuristics
- linux文件系统启动分析(转载)
- 机顶盒下周招标,直播卫星蓄势待发
- 100 个高质量的 XHTML/CSS 模板(下)