首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

一个信号连接多个槽的有关问题

2012-12-16 
一个信号连接多个槽的问题如题,在多个窗口中,我有一个窗口中的1个信号连接另一窗口的多个槽函数时,我要只

一个信号连接多个槽的问题
如题,在多个窗口中,我有一个窗口中的1个信号连接另一窗口的多个槽函数时,我要只执行某个槽函数而不执行其他的槽函数有没有什么办法呢?
[最优解释]

引用:
我在B窗口就只有OK 和cancel两个按钮


实际上用户看到就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());
      }
}
其实不用信号和槽。这是一般对话框的用法。
[其他解释]
引用:
我有加参数的,我是想实现这样的效果:
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()函数中发送信号 ……


首先,我觉得你没有弄清楚信号槽的具体用法。你说不知道过来的信号是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));
    }



[其他解释]
我说的好像也不对,能否举个例子,谢谢
[其他解释]

引用:
刚接触Qt, 如果我加了标志,是否要这样来写?而不是把这些connect放到构造函数里?

void Add_Edit::on_Add_Btn_clicked()

    b.show();
    if(flags == 0)
    {
       connect(&b,SIGNAL(singal1),this,SLOT(fun1));
……


你这样在类里面加标志量比较麻烦。

你可以在信号里面加上参数,信号可以这么定义:
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?
[其他解释]

引用:
终于看明白了,这里需要这样,有两个按钮add、edit点击两个按钮完成不同的工作。
给两个按钮添加clicked槽,有了两个槽之后,
add槽:{
      InputIdalog dlg;
      if(dlg.exec == QDialog::Acceped){
              exit->appendtext(dlg.text());
      }

e……


是在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的。
[其他解释]
引用:
引用:
那我怎么去判断我在点A中的add或者edit时在B中知道是添加还是修改数据呢?在A中发信号给B?

LZ为什么纠结怎么判断?你点中A的add,这个时候跳出B窗口中只有2个按钮,OK_1和cancel,OK_1的功能只是增加数据;点中A的edit,这时跳出的B窗口中只有OK_2和cancel,OK_2的功能只是编辑数据。
这个需要判断么?


你这个明白了,谢谢。
[其他解释]
引用:
那我怎么去判断我在点A中的add或者edit时在B中知道是添加还是修改数据呢?在A中发信号给B?


LZ为什么纠结怎么判断?你点中A的add,这个时候跳出B窗口中只有2个按钮,OK_1和cancel,OK_1的功能只是增加数据;点中A的edit,这时跳出的B窗口中只有OK_2和cancel,OK_2的功能只是编辑数据。
这个需要判断么?
[其他解释]
引用:
另外有个问题就是 我A B两个窗口


class A
{
private:
B b;
}

class B
{
private:
A a;
}

这样相互调用为什么不行,会报A不是定义的类型,如果把A a; 去掉是没问题的,谢谢



LZ为什么不用一个class C来管理A和B呢?

class C
{
    A a;
    B b;
}

[其他解释]
我的也是这问题

热点排行