QT入门级体验,包括解决的若干问题

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值