【QT學習】如何分析一個QT類


作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

我們以QLineEdit這個類為例來看看如何學習分析一個QT類。

1.Public Types:

這是一個在這個類中可以供我們使用的公共枚舉類型。這也就是說,我們可以如下使用這個公共類型:

// some code
..
QLineEdit::EchoMode mode;
mode = myLineEdit->echoMode();
 
...
 
mode = QLineEdit::NoEcho;
myLineEdit->setEchoMode( mode );
// or directly myLineEdit->setEchoMode( QLineEdit::NoEcho );

Public types經常使用在Properties中。

2.Properties

Properties可以被get和set,上邊的例子就有所體現。

3.Public Functions

這個部分提供了大量這個類實例的方法,textEdit->append( "Path to file: " + lineEdit->text() );

4.Public Slots

這個部分描述了我們能連接信號的一些動作,這些動作構成了與其連接的signal的結果,也就是說,一個signal發出回導致一個一個slot的動作發生。我們也可以自定義信號槽,比如:

myqtapp.h

public slots: 

void mySlot(const QString&);

myqtapp.cpp

void myQtApp::mySlot(const QString& passedStr)
{
    QMessageBox::information(this, "Some window label here", "String: " + passedStr);
}
然后我們以這樣的方式連接這個槽:connect( lineEdit, SIGNAL( textEdited (const QString&) ), this, SLOT( mySlot(const QString&) ) );

5.Signals

這個部分描述了這個類能發出信號的部分,這些信號與特定的slot連接,導致了slot對應動作的發生。也就是說,信號相當於原因,而slots相當於結果。比如

 connect( pushButton_clear, SIGNAL( clicked() ), this, SLOT( clear() ) );

在這里我們把pushButton_clear的clicked信號連接到了this的clear() 槽上,當這個按鍵按下時,this就會執行這個clear的動作。我們也可以自定義信號:

myqtapp.h

public:
    myQtApp(QWidget *parent = 0);
 
signals:
    void customSignal( const QString& );
..

myqtapp.cpp - 要使用emit關鍵字

void myQtApp::clear()
{
emit customSignal( textEdit->toPlainText() );//信號在此發出,帶一個字符串
    textEdit->clear();
}

我們可以如下連接我們自定義的信號:connect( this, SIGNAL( customSignal (const QString&) ), this, SLOT( mySlot(const QString&) ) );

6.Protected functions

這個就是C++傳統意義上的Protected方法。

7.Static Public Members

這個也是指全局都能使用的類方法,不需要創建實例就可以直接調用。

8.const QString &

這個定義在QT的文檔中經常見到。其實這個也可以不加const &,主要是為了performance——在方法中不需要再復制一份參數,提高了程序性能。const則是說這個傳進來的參數不可修改。

9.在堆上或者棧上分配內存

例如,我們使用QProcess這個類,我們寫了如下的函數:

void myQtApp::function() 
{
    QProcess proc; // we create this proc variable on stack
    proc.start("regedit.exe"); // start program regedit.exe
}

我們以為會調用這個exe,但實際上並沒有,終端調試信息顯示:

QProcess: Destroyed while process is still running.

這是因為變量在程序棧上,當這個變量越出了這個范圍,棧上的這個部分的內存就會被釋放。在我們這個例子中,proc在這個程序執行結束前就被銷毀了。解決的方法就是在堆上建立這個變量:當程序員使用new進行動態內存分配的時候,內存是分配在堆(虛擬內存,包括板上RAM和硬盤剩余空間所分配的硬盤)上的。

void myQtApp::function() 
{
    QProcess *proc; // pointer definition
    proc = new QProcess( this ); // memory allocation from heap, created with parent
    proc->start("regedit.exe"); // start program
}

注意使用this的的原因是父進程銷毀后子進程亦銷毀。

另外一種方法是將proc放入類myQtApp中成為一個類成員。

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM