2011-11-28 30 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