作者: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中成為一個類成員。
