使用Qt设计GUI的正确方法

时间:2011-11-28 08:27:21

标签: qt

我刚刚开始使用Qt,我对整个信号槽系统感到非常失望 我理解一般概念,但我无法理解设计GUI代码的正确方法是什么。 它应该是一个包含指针的类的层次结构吗?例如,如果我有一个主窗口,请使用按钮W1B1,该按钮应打开另一个窗口W2
很明显为什么W1的类应该保存指向B1的指针,但似乎我需要保持指向W2类的指针,以便连接B1 } clicked()W2的某个自定义插槽发出信号,我不明白为什么......信号插槽机制是不是设计为通用的而不是特定的实例?设计此示例代码的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

  

设计此示例代码的正确方法是什么?

使用Qt Designer创建一个简单的UI,并查看它生成的内容。当我开始使用Qt时,这对我帮助很大。

答案 1 :(得分: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__);
}