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