【问题标题】:With several widgets sharing the same signal slot (event handler), how do I find out which one has been clicked?有几个小部件共享同一个信号槽(事件处理程序),我如何找出哪个小部件被点击了?
【发布时间】:2010-09-29 10:45:29
【问题描述】:

在我的项目中,我使用了一个从 QWidget 类派生的自定义圆形按钮小部件。我已将其中几个小部件添加到父小部件中。

当点击这些自定义按钮之一时,我如何找出点击的是哪一个?

向父小部件添加自定义按钮:

void ShotViewCTRL::addShot(QString shotNanme)
{
    ShotButton *btnShot=new ShotButton(this);
    btnShot->shotName=shotNanme;

    connect(btnShot,SIGNAL(Shot_Selected()),this,SLOT(SHOT_CLICKED()));
    btnShot->CreateButton();
    btnShot->show();

}

我的父控件是ShotViewCTRL(继承自QWidget),子控件是ShotButton(自定义控件,继承自QWidget)。

控件工作正常。它正在发送发送到父对象。在我的问题中,我添加了 10 次相同的自定义控件。

我需要找出点击了哪个控件?请帮助我找到解决方案。

我参考了 Qt 文档来找到子小部件,但我不明白。一些示例代码会很棒。

【问题讨论】:

    标签: qt


    【解决方案1】:

    QSignalMapper 是您正在寻找的。使用 QSignalMapper,您可以添加诸如 Id 之类的内容(甚至是指向 QButton 本身的指针)作为信号发射的附加数据,并且您必须调整您的插槽以获取附加数据(ID 或指针)。

    然后要么通过你给你的 objects 一些虚函数 type() 的 id 来区分插槽本身,这样你就可以用它来区分,或者甚至尝试强制转换和捕获错误(提示:不要尝试最后一种方法,在不同的编译器上可能会有不同的效果)。

    【讨论】:

    • 在按钮点击信号中,我通过按钮 id 来查找点击了哪个按钮。它工作正常。我还有一个问题。如何将对象带到前面?因为我有很多小部件。当我点击任何一个我需要带到前面的。现在我知道点击了哪个小部件,但我不能;不能带到前面。你知道该怎么做。
    • 你所说的带到前面是什么意思?重点?
    • 在某种意义上说,控件是重叠的。当我单击控件时,它应该出现在前面。控件从重叠状态完全可见。
    • 创建一个带有屏幕截图的新问题,因为这似乎是更大我仍然不明白这一点。不要忘记接受答案,因为您最初的问题似乎已解决。
    【解决方案2】:

    您可以使用QObject::Sender 函数来查找哪个QObject 发送信号。关于文档中的第一个警告,这就是您要搜索的内容。

    【讨论】:

    • 不要使用QObject::Sender,这违反了Qt的OOP原则
    • 它正在工作。我还有一个问题。如何将对象带到前面?因为我有很多小部件。当我点击任何一个我需要带到前面的。现在我知道点击了哪个小部件,但我不能;不能带到前面。你知道该怎么做。
    • 使用 QObject::sender() 很好——也很简单、高效、切中要害。使用它完全没有缺点。
    【解决方案3】:

    您为具有相同信号的不同按钮指定不同的插槽。您可以识别不同的按钮点击

    【讨论】:

    • 没有。此按钮是在运行时创建的。可能,按钮的数量也会增加到 100 个。所以我不能为每一件事写不同的插槽。我需要使用单个插槽来接收这个。
    • 这些按钮是相同的类名还是不同的?如果你有不同的类名,那么使用 QString className = current->metaObject()->className();获取用于区分的类名
    • 另外,在按钮中保留一个 ID 以区分每个按钮,并在插槽中检查它以了解哪个按钮发出了信号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2014-03-13
    相关资源
    最近更新 更多