1、 Start
- 整理QT应用过程中的一些小知识点,以备后查。
2、 时间日期转成字串
一般用于界面显示,或者存SQLITE。
QString date = QDate::currentDate().toString(QString("yyyy-MM-dd"));
QString time = QTime::currentTime().toString(QString("hh:mm:ss"));
QString dateTime =QDateTime::currentDateTime().toString(QString("yyyy-MM-dd hh:mm:ss"));
3、检测文件
一般用于检测文件系统里生成的文件,USB热插拔等。
QFileSystemWatcher *watcher = new QFileSystemWatcher(this);
watcher->addPath("/dev/");//要检测的目录(如U盘持载等)
connect(watcher , SIGNAL(directoryChanged(QString)), this, SLOT(onDetectFileExist(QString)));//在槽函数中判断是否存在这个特定的文件
4、Qt输出重定向到文件
将qDebug()的输出重定向到文件里。一般用于产品发布后,客户端查问题。
QtMessageHandler qInstallMessageHandler(QtMessageHandler handler)
void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
static QMutex mutex;
mutex.lock();
QString message;
switch (type)
{
case QtDebugMsg:
message = "D:";
break;
case QtWarningMsg:
message = "W:";
break;
case QtCriticalMsg:
message = "C:";
break;
case QtFatalMsg:
message = "F:";
break;
}
message += msg;
QFile file("./log.txt");
file.open(QIODevice::WriteOnly | QIODevice::Append);
QTextStream stream(&file);
stream << message << "\r\n";
file.flush();
file.close();
mutex.unlock();
}
5、Find Children
查找子类,一般把所有的子类集合在一起做一些其它的操作,比如多语言。
QList<T> QObject::findChildren(const QString & name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
//Children has all instance of MyWidget in dialog.
QList<MyWidget*> children = findChildren<MyWidget*>()
//Children has one instance of MyWidget with objectName() == Hi
QList<MyWidget*> children = findChildren<MyWidget*>(“Hi”);
6、通过名字调用槽函数
QMetaObject::invokeMethod(objPtr, "function");
QString retVal;
QMetaObject::invokeMethod(obj, "compute", Qt::DirectConnection,
Q_RETURN_ARG(QString, retVal),
Q_ARG(QString, "sqrt"),
Q_ARG(int, 42),
Q_ARG(double, 9.7));
7、延迟初始化
一般在初始化的时候,放在构造函数初始化又太早了,其它模块还没有起来,这个时候可以延迟一下。
QTimer::singleShot(1000, this, SLOT(init()));
8、打印自定类
主要用于多处需要打印自定类的成员变量。
//声明
QDebug operator<<(QDebug, const CoustomClass&);
//定义
QDebug operator<<(QDebug dbg, const CoustomClass&obj)
{
dbg.nospace()<< "name:" << obj.name()
<< "length:" << obj.length()
<< "height:" << obj.height()
<< "weith:" << obj.weith();
return dbg.space();
}
//使用
CoustomClass a;
qDebug()<<a;
9、线程锁
进入函数加锁,函数返回解锁,用于多线程里的共享资源访问。
QMutex m_mutex;
void exclusiveFunction()
{
//Constructor locks
QMutexLocker(&m_mutex);
//do something
…
} //Destructor unlocks
10、浮点型比较
float 与double类型的数据 “==”运算是有精度问题的,一般要用如下方法:
bool qFuzzyCompare(double p1, double p2)
bool qFuzzyCompare(float p1, float p2)
11、延时一小会儿
延时1秒,不会阻塞线程。
//your code
QTime t;
t.start();
while(t.elapsed()<1000)
QCoreApplication::processEvents();
//your code
12、保存数据
//value 一般使用QVariant
QSettings settings(filename, QSettings::IniFormat);
//存
settings.beginGroup("default");
settings.setValue("size", QSize(x,y));
settings.endGroup();
//取
settings.beginGroup("factory");
int size = settings.value("size").toInt();
settings.endGroup();
在linux下进行完ini 文件的操作后最好要调用 一下系统命令 “sync”。当读写过程中断电会生成一个.lock文件,下次读写时,会读这个.lock文件,这个文件是一个空文件,而QSettings 的读写是阻塞的。
13、消息同步
当要求一个命令序列(信号)是顺序执行时,或者需要发送信号后收到结果再往下执行时,可以使用QEventLoop建立一个临时的消息循环,而不阻塞所以的线程的消息循环。
QEventLoop loop;
manager = new QNetworkAccessManager(this);
QNetworkRequest request;
request.setUrl(QUrl("://file/db.db"));
QNetworkReply *reply = manager->get(request);
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();
QByteArray data = reply->readAll();//直到网络请求返回后再执行下一行代码
14、发布window版本
进 入dos命令行模式,切换到生成的 xx.exe目录下执行:
windeployqt xx.exe
此命令会将xx.exe 所依赖的库都拷贝到本目录下,如果启动时发现提示缺少库时,可以自行去QT的安装目录下查找并拷贝到此目录下即可。
注:windeployqt 是在这个目录 D:\Qt\Qt5.4.0\5.4\mingw491_32\bin 下的一个版本发布工具,如果在cmd里不能识别则把目录加入到环境变量里即可。