Qt Little Tips

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里不能识别则把目录加入到环境变量里即可。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值