QT 编程备忘与总结

参考

备忘

  • 更改程序运行根目录
 qDebug()<<QDir::currentPath();
 QDir::setCurrent(dir);
 qDebug()<<QDir::currentPath();
  • QString, std::string, num
QString.toStdString()
QString.fromStdString()

using namespace std
stringstream ss;
int num;
string str;
ss<<num;
ss>>str;
  • c++11 支持(更改工程文件xxx.pro)
# 添加这一行到xxx.pro
CONFIG +=c++11

Qt 实用插件

  • “帮助”===》“关于插件”===》“实用工具”===》“TODO”
  • 勾选即可查看或自定义tag,如todo,fixme,note

qmake 简单用法

  • qmake高级用法包括if else 等控制语句,对不同系统的支持等。qt 自带的文档中有很多介绍。
语法:
$$xxx : xxx的实际值
xxx += aaa :令xxx设为$$xxx aaa
xxx = aaa : 令xxx=aaa
\ :添加多行
# : 注释


# 添加链接库
LIBS+= xxx.so
# 添加链接目录
LIBS+= -Lxxx/lib

# 添加头文件库
INCLUDEPATH+=xxx/include \
    xxx/include

# 添加头文件
HEADERS +=a.h \
    b.h \
    c.h

# 添加源文件
SOURCES +=main.cpp \
    a.cpp \
    b.cpp \
    c.cpp \

# c++11
CONFIG +=c++11

# 添加qmake的pro模块
include(xxx.pro)

# opencv demo
    INCLUDEPATH+=/usr/include/opencv \
        /usr/include/opencv2 \
        /usr/include \

    cvLibRoot=/usr/lib/x86_64-linux-gnu

    LIBS += $$cvLibRoot/libopencv_videostab.so \
		$$cvLibRoot/libopencv_video.so \
        $$cvLibRoot/libopencv_ts.so \
		$$cvLibRoot/libopencv_superres.so \
        $$cvLibRoot/libopencv_stitching.so \
		$$cvLibRoot/libopencv_photo.so \
        $$cvLibRoot/libopencv_ocl.so \
		$$cvLibRoot/libopencv_objdetect.so \
        $$cvLibRoot/libopencv_ml.so \
		$$cvLibRoot/libopencv_legacy.so \
        $$cvLibRoot/libopencv_imgproc.so \
		$$cvLibRoot/libopencv_highgui.so \
        $$cvLibRoot/libopencv_gpu.so \
		$$cvLibRoot/libopencv_flann.so \
        $$cvLibRoot/libopencv_features2d.so \
		$$cvLibRoot/libopencv_core.so \
        $$cvLibRoot/libopencv_contrib.so \
		$$cvLibRoot/libopencv_calib3d.so \
                $$cvLibRoot/libopencv_nonfree.so

qmake 高级用法

# use opencv lib
CONFIG += link_pkgconfig
PKGCONFIG += opencv

# or
INCLUDEPATH += `pkg-config --cflags opencv`
LIBS += `pkg-config --libs opencv`

Qt 工程介绍

  • Qt Widgets Application: 图形界面,自带ui form
  • Qt console Application: 终端界面,精简的工程
  • Empty Qt Project: 可以使用cmake,qmake等
  • Subdirs Project: 总工程,可以在Subdirs Project 下面新建子工程,这样可以在同一个工程下面包含多个main.cpp, 从而进行多个程序。注意,subdirs project 中,任何一个子工程都不能出错,否则任何一个子工程都无法单独运行(给调试带来极大难度,如果多个子工程引用同一个文件,而某个子工程引用出错,出现undefine xxx的错误,你只能一个个子工程检查)。

QThread and QProcess

  • QThread 可以通过继承或者函数转移开一个新的线程
  • QProcess 适合调用外部程序,如系统浏览器,或者其它可执行程序,脚本。
  • 如果需要在进程间通信,如通过QPushButton 开始、暂停、继续、结束一个线程。用QThread即可。
    • 通过MyQThread继承QThread,重写void run()方法
    • 开始: MyQThread.start(),它会自动调用run()
    • 暂停:MyQThread.sleep(),MyQThread.msleep(),MyQThread.usleep()
    • 继续:see the code below
    • 结束:MyQThread.wait(),MyQThread.deleteLater(),要注意通过wait()等待线程结束才能删除线程,否则直接删除容易导致程序崩溃。
  • QThread 的运行状态可以通过isRunning(),isFinished(),isInterruptionRequested()获得。

Pause and Resume a QThread

class MyWorker: public QThread
{
private:
    QMutex sync;
    QWaitCondition pauseCond;
    bool pause;

public:
    MyWorker(...): pause(false) {}

    void resume()
    {
        sync.lock();
        pause = false;
        sync.unlock();
        pauseCond.wakeAll();
    }

    void pause()
    {
        sync.lock();
        pause = true;
        sync.unlock();
    }

protected:
    void run()
    {
        while(someCondition) // gues it's your loop
        {
             sync.lock();
             if(pause)
                 pauseCond.wait(&sync); // in this place, your thread will stop to execute until someone calls resume
             sync.unlock();

             // do your operation
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值