Qt Little Tips

来源:互联网 发布:西北师范知行教务管理 编辑:程序博客网 时间:2024/05/16 12:32

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() == HiQList<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 codeQTime 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();//直到网络请求返回后再执行下一行代码