2011-11-28 59 views
2

我剛開始使用Qt,我對整個信號插槽系統感到迷茫。
我瞭解一般概念,但我不明白什麼是設計我的GUI代碼的正確方法。 它應該是一個類的層次結構,指向彼此的指針?例如,如果我有一個主窗口,比如W1,按鈕B1應該打開另一個窗口W2
這是相當顯而易見的,爲什麼W1的類應該持有一個指向B1,但似乎我需要保持指針W2的課,爲了B1clicked()信號連接的W2一些定製的插槽,和我不明白爲什麼......信號時隙機制不是被設計成通用的而不是具體的實例明智的?設計這個例子代碼的正確方法是什麼?用Qt設計一個圖形用戶界面的正確方法

回答

1

連接總是在類的實例之間創建。信號和插槽是通知B類的一個實例在A類實例中存在變化或事件的機制。

下面是類W1的設計,其將顯示當按鈕B1被點擊時的窗口W2。我跳過了W1類的初始化,也獲得了按鈕B1,因爲沒有幾種方法可以創建窗口的UI。我加了檢查連接是否成功,只是爲了安全(我的習慣)。

class W1 :public QWidget 
{ 
public: 
A(QWidget *parent = 0):QWidget(parent) 
{ 
    //init 
    B1 = getB1(); 
    if(!connect(B1,SIGNAL(clicked()),this,SLOT(show_W2()))) 
     qFatal("%s %i connection failed B1->clicked this->show_W2",__FILE__,__LINE__); 
} 

public slots: 
    void show_W2() 
    { 
     QWidget *W2 = new Window2(this->parent()); 
     //create window 
    } 
protected: 
    QPushButton *B1; 
} 

這是不同的方法來你的例子,其中類W1現在不任何有關類W2:

class W1 :public QWidget 
{ 
public: 
A(QWidget *parent = 0):QWidget(parent) 
{ 
    //init 
    B1 = getB1(); 
    if(!connect(B1,SIGNAL(clicked()),this,SIGNAL(B1_clicked()))) 
     qFatal("%s %i connection failed B1->clicked this->B1_clicked",__FILE__,__LINE__); 
} 

signals: 
    B1_clicked() 
} 

void MainWindow::creatW1() 
{ 
    W1 *_w1 = new W1; 
    if(!connect(_w1,SIGNAL(B1_clicked()),this,SLOT(createW2()))) 
     qFatal("%s %i connection failed _w1->B1_clicked this->show_W2",__FILE__,__LINE__); 
} 
+0

在哪裏我可以找到如何正確初始化小部件的類? – Sugar

+0

你的意思是Ui初始化?如果你已經安裝了Qt Creator,使用選項「Create form」創建Qt GUI項目,並檢查生成的代碼。在大多數情況下,這是推薦的初始化方式。 – firescreamer

+0

在大多數情況下,UI初始化是手動的。即使在Qt的例子和教程中。這有點令人驚歎。生成的代碼很有幫助。 – Sugar

3

設計此示例代碼的正確方法是什麼?

使用Qt Designer創建一個簡單的UI並查看它生成的內容。當我開始使用Qt時,這幫助了我很多。

+0

這正是我所做的一切,但我如何創建2個部件之間的連接/類?信號插槽編輯器無法識別其他類插槽... –

+2

在您的代碼中手動連接這些插槽。請參閱QObject :: connect()。 – arrowd