1.找不到相应的函数
对于这个问题,可能是好久不用windows编译了,其实就是头文件里面的函数在编译的初步会生成一个函数接口表,但是在运行的时候去调用这个函数,发现这个函数是没有实例化的,就会造成无法识别该函数的错误
2.QWight
在生成UI的时候,会产生QCoreApplication和相应的头文件,我们一般要使用的话,就要QApplication和相应的头文件来使用
//QCoreApplication a(argc, argv);
//which caused problem : cannot create a QWidget without QApplication
全新的数据类型:
quint16 :qt软件里面的16位无符号数字
3.foreach
foreach(Type value, Type STl),在用法和功能上接近于for(auto value : STL),是QT自带的一个关键字,用来循环查找STL中的value
QT 5.7以后将没有这个关键字
4.QList添加元素
QList<QString> list;
list << "aa" << "bb" << "cc"; // 插入项目
1
2
赋值操作
list[0] = "aa";
1
替换操作
list.replace(2, "bc");
1
获取大小
int length = list.size();
1
获取元素值
list.at(i)
1
在列表尾部添加
list.append("dd");
1
在列表头部添加
list.prepend("mm");
1
删除元素并获取
QString str = list.takeAt(2);
1
在指定位置插入
list.insert(2, "mm");
1
交换元素
list.swap(1,3);
1
列表是否包含某值
list.contains("mm");
1
列表包含某值个数
list.count("mm");
1
元素位置,从0开始查找
list.indexOf("mm");
1
元素位置,从指定位置查找
list.indexOf("mm", 2);
3.QT中类构造函数关键字explicit
class Test1
{
public:
Test1(int n) { num = n; } //普通构造函数
private:
int num;
};
class Test2
{
public:
explicit Test2(int n) { num = n; } //explicit(显式)构造函数
private:
int num;
};
int main()
{
Test1 t1 = 12; //隐式调用其构造函数, 成功
Test2 t2 = 12; //编译错误,不能隐式调用其构造函数
Test2 t3(12); //显示调用成功
return 0;
}
4.
5.PRO文件配置
INCLUDEPATH += C:/Users/user/Documents/CVImage/opencv/build/include
CONFIG(debug,debug|release) {
LIBS += C:/Users/user/Documents/CVImage/opencv/build/x64/vc14/lib/*d.lib
} else {
LIBS += C:/Users/user/Documents/CVImage/opencv/build/x64/vc14/lib/*.lib
}
CONFIG(debug, debug|release) {
LIBS += -L../lib1 -lhellod
} else {
LIBS += -L../lib2 -lhello
}
//此段代码的意思是 debug|release 中是debug时的配置
CONFIG(debug, debug|release): LIBS += -L../lib1 -lhellod
CONFIG(release, debug|release): LIBS += -L../lib2 -lhello
5.QImage
对于QT的界面来说,需要label标签来显示图片,需要的图片格式就是QPixmap,所以我们需要将Mat转换成QImage
cv::Mat --> QImage --> QPixmap
再使用
ui->Label1->setPixmap(QPixmap::fromImage(QTmpImg));
需要注意一点,cv::Mat和QImage的内存管理机制不一样
QImage的构造函数进行转换,主要是使用cv::Mat的data来构造一个QImage类型,这样做确实可以达到转换目的,但是,因此这样构造出来的QImage本身并不保存data,因此,在QImage的生存周期内,必须保证cv::Mat中的数据不会被释放。上面的这个问题也是比较容易解决的,主要是通过调用QImage::bits函数来强制QImage进行深层次复制,使得QImage自己保存一份data的副本,这样就可以保证在cv::Mat中的数据被释放的时候,QImage还能正常使用。
QImage Widget::Mat2QImage(cv::Mat const& src)
{
cv::Mat temp; // make the same cv::Mat
cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need
QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
dest.bits(); // enforce deep copy, see documentation
// of QImage::QImage ( const uchar * data, int width, int height, Format format )
return dest;
}
cv::Mat Widget::QImage2Mat(QImage const& src)
{
cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine());
cv::Mat result; // deep copy just in case (my lack of knowledge with open cv)
cvtColor(tmp, result,CV_BGR2RGB);
return result;
}