【求助】发送一次信号槽函数多次响应

Joker____ 2011-08-30 05:11:42
我在一个mainwidget里面 有两个不同的widget 然后通过点击切换两个widget 并且每次切换都把不显示的widget hide 并且用disconnect取消与mainwidget的信号关联

单步调试 确认emit 语句只执行了一次
但是在槽函数处却多次执行。。。

请问这可能是什么情况?

...全文
616 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kaladoudou 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kaladoudou 的回复:]

引用 6 楼 joker____ 的回复:

引用 5 楼 kaladoudou 的回复:

引用 1 楼 joker____ 的回复:

补充一下 执行次数跟我切换次数还有关系。。。。


可能是 信号和槽重复链接。

重复多少次,槽就会执行多少次。


呃 重复链接已经排除啦 我就一个地方connect了 而且换的时候我也立马disconnect了的。、。。。
……
[/Quote]

补充一下:
你检查下disconnect返回值,就会看到结果。

bool QObject::disconnect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method ) [static]

Disconnects signal in object sender from method in object receiver. Returns true if the connection is successfully broken; otherwise returns false.

A signal-slot connection is removed when either of the objects involved are destroyed.

disconnect() is typically used in three ways, as the following examples demonstrate.

Disconnect everything connected to an object's signals:

disconnect(myObject, 0, 0, 0);

equivalent to the non-static overloaded function

myObject->disconnect();

Disconnect everything connected to a specific signal:

disconnect(myObject, SIGNAL(mySignal()), 0, 0);

equivalent to the non-static overloaded function

myObject->disconnect(SIGNAL(mySignal()));

Disconnect a specific receiver:

disconnect(myObject, 0, myReceiver, 0);

equivalent to the non-static overloaded function

myObject->disconnect(myReceiver);

0 may be used as a wildcard, meaning "any signal", "any receiving object", or "any slot in the receiving object", respectively.

The sender may never be 0. (You cannot disconnect signals from more than one object in a single call.)

If signal is 0, it disconnects receiver and method from any signal. If not, only the specified signal is disconnected.

If receiver is 0, it disconnects anything connected to signal. If not, slots in objects other than receiver are not disconnected.

If method is 0, it disconnects anything that is connected to receiver. If not, only slots named method will be disconnected, and all other slots are left alone. The method must be 0 if receiver is left out, so you cannot disconnect a specifically-named slot on all objects.

Note: This function is thread-safe.

See also connect().
kaladoudou 2011-08-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 joker____ 的回复:]

引用 5 楼 kaladoudou 的回复:

引用 1 楼 joker____ 的回复:

补充一下 执行次数跟我切换次数还有关系。。。。


可能是 信号和槽重复链接。

重复多少次,槽就会执行多少次。


呃 重复链接已经排除啦 我就一个地方connect了 而且换的时候我也立马disconnect了的。、。。。
[/Quote]

你确实是在一个地方connect的,但是会被调用多次。
你确实是执行disconnect了,但是没有成功。

3楼正解!
乔巴好萌 2011-08-30
  • 打赏
  • 举报
回复
你不要在UI的事件里进行connect
一版初始化时 connect一次即可
用QSignalSpy看看 问题出在哪里 设计上感觉有些不当
Joker____ 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kaladoudou 的回复:]

引用 1 楼 joker____ 的回复:

补充一下 执行次数跟我切换次数还有关系。。。。


可能是 信号和槽重复链接。

重复多少次,槽就会执行多少次。
[/Quote]

呃 重复链接已经排除啦 我就一个地方connect了 而且换的时候我也立马disconnect了的。、。。。
kaladoudou 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 joker____ 的回复:]

补充一下 执行次数跟我切换次数还有关系。。。。
[/Quote]

可能是 信号和槽重复链接

重复多少次,槽就会执行多少次。
Joker____ 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dbzhang800 的回复:]

呵呵,没心情看你这代码是在做什么。简单说一点吧
1. 所有的 disconnect 都用错了。至少你用的代码和你想的肯定不一样!

题外:
* 不要在connect或disconnect前面加 QObject::,完全没必要
[/Quote]

额 请问为什么用错了呢?
那个加QObject::完全是习惯问题。。。呵呵
dbzhang800 2011-08-30
  • 打赏
  • 举报
回复
呵呵,没心情看你这代码是在做什么。简单说一点吧
1. 所有的 disconnect 都用错了。至少你用的代码和你想的肯定不一样!

题外:
* 不要在connect或disconnect前面加 QObject::,完全没必要
Joker____ 2011-08-30
  • 打赏
  • 举报
回复
demo如下。。。谢谢了


MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
pOne = new WidgetOne;
pTwo = new WidgetTwo;
ui->verticalLayout->addWidget(pOne);
QObject::connect(this,SIGNAL(sendToOneSignal()),
pOne,SLOT(receiveSlot()));
currentWidget = 1;
QObject::connect(ui->pushButton,SIGNAL(clicked()),
this,SLOT(pushBtnOneSlot()));
QObject::connect(ui->pushButton_2,SIGNAL(clicked()),
this,SLOT(pushBtnTwoSlot()));

}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::pushBtnOneSlot()
{
if (currentWidget == 1)
return ;
else
{
ui->verticalLayout->removeWidget(this->pTwo);
this->pTwo->hide();
QObject::disconnect(this,SIGNAL(sendToTwoSignal()));
ui->verticalLayout->addWidget(this->pOne);
this->pOne->show();
QObject::connect(this,SIGNAL(sendToOneSignal()),
this->pOne,SLOT(receiveSlot()));
currentWidget = 1;
if (this->pOne->isVisible())
emit sendToOneSignal();
}


}

void MainWindow::pushBtnTwoSlot()
{
if (currentWidget == 2)
return ;
else
{

ui->verticalLayout->removeWidget(this->pOne);
this->pOne->hide();
QObject::disconnect(this,SIGNAL(sendToOneSignal()));
ui->verticalLayout->addWidget(this->pTwo);
this->pTwo->show();
QObject::connect(this,SIGNAL(sendToTwoSignal()),
this->pTwo,SLOT(receiveSlot()));
currentWidget = 2;
if (this->pTwo->isVisible())
emit sendToTwoSignal();
}
Joker____ 2011-08-30
  • 打赏
  • 举报
回复
补充一下 执行次数跟我切换次数还有关系。。。。

16,219

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧