参考
备忘
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;
# 添加这一行到xxx.pro
CONFIG +=c++11
Qt 实用插件
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 高级用法
CONFIG += link_pkgconfig
PKGCONFIG += opencv
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)
{
sync.lock();
if(pause)
pauseCond.wait(&sync);
sync.unlock();
}
}
};