一个信号连接多个槽的问题如题,在多个窗口中,我有一个窗口中的1个信号连接另一窗口的多个槽函数时,我要只
一个信号连接多个槽的问题
如题,在多个窗口中,我有一个窗口中的1个信号连接另一窗口的多个槽函数时,我要只执行某个槽函数而不执行其他的槽函数有没有什么办法呢?
[最优解释]
实际上用户看到就2个按钮。一个OK_1按钮用来实现add功能,一个OK_2按钮用来实现edit功能,一个cancel,点击A窗口的add,则显示OK_1,隐藏OK_2,点击edit,则显示OK_2,隐藏OK_1。
OK_1和_OK_2同时只能显示一个,而且2个按钮的坐标是一样的
[其他解释]终于看明白了,这里需要这样,有两个按钮add、edit点击两个按钮完成不同的工作。
给两个按钮添加clicked槽,有了两个槽之后,
add槽:{
InputIdalog dlg;
if(dlg.exec == QDialog::Acceped){
exit->appendtext(dlg.text());
}
}
edit槽:{
InputIdalog dlg;
dlg.setText("要修改的text");
if(dlg.exec == QDialog::Acceped){
exit->appendtext(dlg.text());
}
}
其实不用信号和槽。这是一般对话框的用法。
[其他解释]首先,我觉得你没有弄清楚信号槽的具体用法。你说不知道过来的信号是add的还是edit。
你在A中有2个button,一个add按钮,一个edit按钮。那这2个按钮的信号槽是分开的,分别是
connect(add_button, SIGNAL(click()), B, SLOT(slot()));
connect(edit_button, SIGNAL(click()), B, SLOT(slot()));
虽然这2个按钮在点击时发出的信号都是click,但是分别是由2个对象(add_button和edit_button)发送这个信号。就好像有A,B两个人,A会说话,B也会说话,但是这2个人说话我们是区分开来的。
[其他解释]给信号添加参数吧...要不就增加信号的种类了
[其他解释]我想实现当某个条件成立时,执行某个槽函数
[其他解释]貌似你可以直接这么去触发槽函数,条件判断成立的话,直接:
emit slotfun(); //slotfun()是槽函数
emit可以触发信号,也可以触发槽函数的,我隐约记得之前这么用过,楼主试下看可以不.
[其他解释]我是用emit,我是这样的,我点击一个按钮后触发一个槽函数,然后槽函数里emit。 我的意思是,我有A,B窗口,A emit 信号, B 接收信号, B有两个槽(fun1, fun2)函数都与同个信号相连,我要在B中当我想只执行1个槽函数时另一个槽函数不执行
[其他解释]因为我在A窗口中有tablewidget, 我想在B窗口中输入数据然后在A窗口中显示数据,我现在在A窗口中有添加数据和修改数据按钮,当点这些按钮时,在B窗口中输入数据后会发送信号过A,A怎么来判断是添加的数据还是修改的数据而执行对应的槽函数?
[其他解释]B窗口有多个可以输入数据的控件
[其他解释]我增加信号,每个槽对应一个信号的话,因为我是在B中按按钮后emit信号的,这样2个信号都会发送过去,都会执行啊,显示到tablewidget上就会有问题了
[其他解释]加参数吧,设个标志。
[其他解释]刚接触Qt, 如果我加了标志,是否要这样来写?而不是把这些connect放到构造函数里?
void Add_Edit::on_Add_Btn_clicked()
{
b.show();
if(flags == 0)
{
connect(&b,SIGNAL(singal1),this,SLOT(fun1));
}
}
void Add_Edit::on_Edit_Btn_clicked()
{
b.show();
if(flags ==1)
{
connect(&b,SIGNAL(singal1),this,SLOT(fun2));
}
}
[其他解释]
我说的好像也不对,能否举个例子,谢谢
[其他解释]
你这样在类里面加标志量比较麻烦。
你可以在信号里面加上参数,信号可以这么定义:
signals:
void my_signal(int i)
然后信号槽这么连接:
connect(object_a, SIGNAL(my_signal(int)), object_b, SLOT(my_slot(int)));
在my_slot中,根据具体不同参数的数据来执行不同的功能。
[其他解释]我有加参数的,我是想实现这样的效果:
1. 在A中点add按钮,弹出B,在B中输入数据按OK按钮后显示到A
2. 在A中点edit按钮,弹出B,在B中输入数据按OK按钮后显示到A
在B中,在b.cpp中connect(ui->OK_Btn, SIGNAL(clicked()), this, SLOT(emit_Msg()));
emit_Msg()函数中发送信号 signal(QString, QString);我点add 和edit 按钮时都是用这个信号来发给A。
现在的问题是,我在点A中add按钮或者edit按钮时,我怎么知道发过来的信号是add的还是edit的,我在A中要怎么才能够判断的出然后执行对应的槽函数。
或者说要实现这样的效果的话,有没有更好的方法呢?谢谢!
[其他解释]我在add , 和edit按下后都是
void Add_Edit::on_Add_Btn_clicked()
{
b.display(); //重新写了show(),清空lineEdit后b.show()
}
void Add_Edit::on_Edit_Btn_clicked()
{
b.show();
}
你的意思是我点击add 和 edit后都要发信号给B?
[其他解释]moxiaofeng77 : 你可能误解我的意思,我在A窗口中有tablewidget, add_button, edit_button,remove_button , B窗口中有OK_button。 我点击add_button或edit_button后,弹出B窗口,在B窗口输入数据后点OK_button,数据显示到tablewidget上,现在的问题是我实现了添加数据的功能,修改数据的功能没实现。
修改数据的功能我只是在点击edit后记录选中的item,在A窗口中增加了个接收原来信号的一个槽,通过这个槽函数更新item的数据.
[其他解释]删除数据的功能也实现了,就差修改数据的功能
[其他解释]你可以这样做:
在B窗口的同一个位置,设置2个button,一个add按钮,一个edit按钮,默认显示add,隐藏edit。
connect(add_button, SIGNAL(click()), B, SLOT(slot_add()));
connect(edit_button, SIGNAL(click()), B, SLOT(slot_edit()));
在slot_add()中,显示add按钮,隐藏edit按钮,add按钮提供添加数据的功能;
在slot_edit()中,显示edit按钮,隐藏add按钮,edit按钮提供修改数据的功能。
在2个槽中,先控制2个按钮的显隐,再显示整个B窗口。
以上是我个人意见
[其他解释]你的意思是不管点击的是add还是edit,都弹出B窗口,如果点击的是add,B窗口的OK是执行add操作,如果是edit,B窗口的OK执行edit操作??
[其他解释]我这两个按钮都要显示,有没有什么办法可以实现呢?
[其他解释]是的,我的本意是:
1. 我点击add,弹出B窗口,在B窗口中输入数据后按B窗口的OK按钮后,B窗口隐藏,把数据显示到A中的tablewidget;
2. 选中tablewidget某行数据, 点edit,弹出B窗口,在B窗口中修改原来的数据后按B窗口的OK按钮后,B窗口隐藏,把更新的数据显示到tablewidget上。
A窗口是在主窗口中创建的
[其他解释]
我在B窗口就只有OK 和cancel两个按钮
[其他解释]
那我怎么去判断我在点A中的add或者edit时在B中知道是添加还是修改数据呢?在A中发信号给B?
[其他解释]
是在A中的?
好像不对,我在B窗口中有6个lineEdit, 还有其他的一些可以输入数据的控件,
InputIdalog dlg;
if(dlg.exec == QDialog::Acceped){
exit->appendtext(dlg.text());
}
这样不能一下实现吧?
[其他解释]终于看明白了,这里需要这样,有两个按钮add、edit点击两个按钮完成不同的工作。
给两个按钮添加clicked槽,有了两个槽之后,
add槽:{
InputIdalog dlg;
if(dlg.exec == QDialog::Acceped){
table->setText(dlg.text());
}
}
edit槽:{
InputIdalog dlg;
dlg.setText("要修改的text,table->text(xxx,xxx)");
if(dlg.exec == QDialog::Acceped){
table->SetText(dlg.text());
}
}
其实不用信号和槽。这是一般对话框的用法。
就是这个意思,具体的QTable函数,请查看帮助。
[其他解释]就是有1000个输入部件有1000个值能怎么样呢?
还不是一样!
这样的对话框,和程序关联度最低,对话框就是取用户的输入数据。
[其他解释]应该要用到信号和槽吧?
[其他解释]另外有个问题就是 我A B两个窗口
class A
{
private:
B b;
}
class B
{
private:
A a;
}
这样相互调用为什么不行,会报A不是定义的类型,如果把A a; 去掉是没问题的,谢谢
[其他解释]dlg.text()? 是窗口中全部控件中的全部的输入数据?
我的tablewidget 有多个headers的。
[其他解释]你这个明白了,谢谢。
[其他解释]LZ为什么纠结怎么判断?你点中A的add,这个时候跳出B窗口中只有2个按钮,OK_1和cancel,OK_1的功能只是增加数据;点中A的edit,这时跳出的B窗口中只有OK_2和cancel,OK_2的功能只是编辑数据。
这个需要判断么?
[其他解释]LZ为什么不用一个class C来管理A和B呢?
class C
{
A a;
B b;
}
[其他解释]我的也是这问题