qt開發中遇到的問題整理五

1.請問可以在Qthread裏面 操作 ui控件嗎? 
不可以。 文檔原文: In GUI applications, the main thread is also called the GUI thread because it's the only thread that is allowed to perform GUI-related operations 
所以只能通過信號和槽機制進行傳遞


2.QT4增加了一個非常有用的類QSettings 
QSettings是qt4.0提供的一個讀取配置文件的類,在windows平臺,它提供了ini文件讀些,註冊表讀寫的功能。而且使用也非常簡單。大家可以參照它的示例:$QTDIR\examples\tools\settingseditor

我就簡單點隨便介紹介紹它的使用吧
QSettings::Format有兩種:
QSettings::NativeFormat在windows平臺可以讀寫windows註冊表.
QSettings::IniFormat可以讀寫ini格式的配置文件
在Unix/X11平臺下這兩個Format效果是一樣的:(

1).讀寫註冊表
//注意的就是路徑名必須是"/"而不是"\\"等.否則不能讀寫,同時注意
//Format爲QSettings::NativeFormat
QSettings *settings = new QSettings("HKEY_CURRENT_USER/", QSettings::NativeFormat);

//寫HKEY_CURRENT_USER/regedit/test,設置test值爲red
settings->setValue("regedit/test", "red");

//讀 HKEY_CURRENT_USER/regedit/test,默認值是ddd
QString value = settings->value("regedit/test", "ddd").toString();

刪除設置對應的是settings->remove( const QString & key )

2).讀取ini配置文件
ini文件格式如下:
[Alpha]
Beta/Beta=1
Beta/Gamma=2
Beta/Delta=1111
Beta/Epsilon=5
Iota=7
Omicron=11

QSettings *settings = new QSettings(fileName, QSettings::IniFormat);

//寫Beta/Beta
settings->setValue("Alpha/Beta/Beta", 68);

其他和讀寫註冊表差不多,我就懶得寫了
發覺QT4讀寫的這種配置,即可兼容windows下的ini文件,同時它的功能也比windows API所提供的功能強.



3.QTextEdit如何得到光標所在的行和列??

首先獲取QTextEdit 的當前光標
const QTextCursor cursor = textEdit->textCursor();
然後
int ColNum = cursor.columnNumber();
int RowNum = cursor.blockCount();
這樣就over了 


4.隱藏滾動條: 
一般有滾動條的控件都有setVerticalScrollBarPolicy和setHorizontalScrollBarPolicy函數, 
只要設置爲Qt::ScrollBarAlwaysOff就可以隱藏滾動條了,默認是Qt::ScrollBarAsNeeded需要時纔出現。 


5.用qt把數據寫入Excel 中

用qt把數據寫入Excel 中:
代碼:
QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
        "",
        tr("file ( *.CSV)"));
    if(fileName == "")
    {
        return;
    }
    QTextCodec *code;
    code = QTextCodec::codecForName("gb18030");

    std::string strbuffer = code->fromUnicode(fileName).data();
    FILE *fileWrite = fopen( strbuffer.c_str(),"w");
    QString strFemale = "Female Count";
    QString strMale = "Male Count";
    QString strPatientCount = "Patient Count";
    QString str ="\n";
    std::string strCountbuffer = code->fromUnicode(strFemale+","+strMale+","+strPatientCount+str+QString().setNum(femaleCount)+","+QString().setNum(maleCount)+","+QString().setNum(patientCount)).data();
    QFile file;
    file.open(fileWrite, QIODevice::WriteOnly);
    file.write(strCountbuffer.c_str(), qstrlen(strCountbuffer.c_str()));        
    file.close(); 


6.linux下寫文件亂碼: 
/* 往文本里寫數據 */
    QFile file("backup_file.txt");
    if(file.open(QIODevice::ReadWrite))
    {
        QTextStream out(&file);
        //設置編碼用的codec
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
        // 設置流的編碼方式       
        out.setCodec(codec);
        for( int i=0; i < 30; i++)
        {
            out << QString::number(i, 10) << "姓名" << endl;
        }
    } 
解決方法:
        //設置編碼用的codec
        //        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
        // 設置流的編碼方式       
        //        out.setCodec(codec);        

7.對話框去掉邊框: 
QWidget::QWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 ) 我們主要是繼承Qwidget類時設置WindowFlags ,設置成Qt::CustomizeWindowHint或Qt::FramelessWindowHint,也可以用函數setWindowFlags進行設置


8.設置控件透明度: 
setWindowOpacity可以設置控件透明度,0.0-1.0,0.0是完全透明,對於容器類控件,它的所有子部件也隨之變透明


9.啓動其他應用程序,比如打開瀏覽器,打開一個excel文件等: 
   openUrl函數可以打開不同類型的文件,程序,網址等,會啓動系統默認打開工具進行打開, 
openUrl ( const QUrl & url ) ;而QUrl以網址的形式設置一個文件全路徑,進行打開。 
如:QUrl url("http://www.example.com/List of holidays.xml"); 
    
    QUrl url; 
    url.setUrl("F:/test/abc.chm");


10. 不要在switch、while,for裏使用qprocess: 
   qprocess是多進程處理的,可能持續時間長,也可能會出異常,所以不要使用。在其他地方使用時,最好在start之後進行等待一段時間,waitforfinish 
   

發佈了122 篇原創文章 · 獲贊 44 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章