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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章