Qt注意事项

 

1.Qt中用到Sleep函数

windows下:

#include <windows.h>

Sleep(DWORD dwMilliseconds)       //毫秒   S大写

Linux下:

#include <unistd.h>

sleep(unsigned int seconds)         //秒    s小写

如果想要将主线程等待100ms,总不能使用sleep吧,那样会导致GUI界面停止响应的,但是用事件循环就可以避免这一点:

 QEventLoop loop;
 QTimer::singleShot(100, &loop, SLOT(quit()));
 loop.exec();

2.查看Qt数据库驱动

#include<QSqlDriver>    
#include<QSqlDatabase>    
#include<QDebug>    

qDebug()<<"Available drivers:";      
QStringList drivers=QSqlDatabase::drivers();      
foreach(QString driver,drivers)        
qDebug()<<driver; 

 

3.QTCreator打开总是未响应

删除~\AppData\Roaming\QtProject文件夹,然后再打开Qt Creator即可。
Linux下,~是/home/YourUserName
Windows下,~是C:\Users\YourUserName


4.VS中的Qt显示中文乱码

QString::fromLocal8Bit("你要显示的中文");

 

5.获取布局中的控件相对窗口的座标

qDebug()<<ui->pushButton->mapToGlobal(QPoint(0,0)).x();
qDebug()<<ui->pushButton->mapToGlobal(QPoint(0,0)).y();
 

6. Qt事务操作

事务是数据库的一个重要功能,所谓事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。在Qt中用transaction()开始一个事务操作,用commit()函数或rollback()函数进行结束。commit()表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到数据库,事务正常结束。rollback()表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有已完成的操作全部撤销,回滚到事务开始时的状态。
如下面的例子:
void Widget::on_pushButton_clicked()
{
    if(QSqlDatabase::database().driver()->hasFeature(QSqlDriver::Transactions))
    { //先判断该数据库是否支持事务操作
        if(QSqlDatabase::database().transaction()) //启动事务操作
        {
            //下面执行各种数据库操作
            QSqlQuery query;  //事务必须由同一个query执行SQL语句
            query.exec("insert into student values (14, 'hello')");
            query.exec("delete from student where id = 1");
            if(!QSqlDatabase::database().commit())
            {
                qDebug() << QSqlDatabase::database().lastError(); //提交
                if(!QSqlDatabase::database().rollback())
                    qDebug() << QSqlDatabase::database().lastError(); //回滚
             }
        }
    }
}

7. Qt添加外部库文件

第一种就是直接加据对路径:

LIBS += D:\Code\Opengltest\OpenGL32.Lib D:\Code\Opengltest\GlU32.Lib  
  

第二种就是直接加库文件,这个的前提是你的库文件必须在工程目录下:
LIBS += OpenGL32.Lib GlU32.Lib  


 第三种就是 多个库在同一个文件夹下的时候,连接使用:
LIBS += -L D:\Code\Opengltest\ -lOpenGL32 -lGlU32  
  

第四种 就是相对路径:
LIBS += -L ./ -lOpenGL32 -lGlU32  

 

8.Qt creator 编译错误:无法解析的外部符号(命令)

问题来自于:只是在creator 中添加了一个新的DIalog类,并在main(),中实例化,就出现如下的错误:

main.obj:-1: error: LNK2019: 无法解析的外部符号 "public: __cdecl Dialog::Dialog(class QWidget *)" (??0Dialog@@QEAA@PEAVQWidget@@@Z),该符号在函数 main 中被引用

main.obj:-1: error: LNK2019: 无法解析的外部符号 "public: virtual __cdecl Dialog::~Dialog(void)" (??1Dialog@@UEAA@XZ),该符号在函数 main 中被引用

debug\DockWindows.exe:-1: error: LNK1120: 2 个无法解析的外部命令

 

先说我的问题的解决办法: 就是重新qmake一下,然后重新构建就可以了。(PS:因为我的头文件都是可以正常include进来的)

 

9.

qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method

 

Qt的这个目录下:D:\Qt\Qt5.4.2\Tools\mingw491_32\opt\bin。自带libeay32.dll和ssleay32.dll.

 

只需要把这个目录下的两个dll拷贝到D:\Qt\Qt5.4.2\5.4\mingw491_32\bin,就不会提示qt.network.ssl: QSslSocket: cannot call unresolved function SSLv23_client_method。

 

 

10.Unicode与GBK互相转换

QByteArray UserConfig::Unicode2GBK(QString inStr)
{
    QTextCodec* gbk = QTextCodec::codecForName("gbk");
    return gbk->fromUnicode(inStr);
}

QString UserConfig::GBK2Unicode(QByteArray inStr)
{
    QTextCodec* gbk = QTextCodec::codecForName("gbk");
    return gbk->toUnicode(inStr);
}

发布了23 篇原创文章 · 获赞 36 · 访问量 19万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章