如何确定QAction的来源?

时间:2011-05-14 16:22:42

标签: c++ qt widget action

我想知道是否有任何简单/优雅的方法来确定QAction的来源? 我的意思是我有一个QAction被添加到多个QWidgets(使用QWidget::addAction),并且当动作的触发信号被发出时,我需要知道哪个QWidget是源,因为我需要查询该特定小部件。 / p>

我认为QAction本身没有办法做到这一点,无论动作从何处触发,父母总是一样的。

我必须解决这个问题的想法是保存一个指向活动小部件的全局指针,但是当小部件收到焦点以将其设置为活动小部件时,Qt中似乎没有优雅的方式来捕获事件。

另一种方法是为每个小部件使用不同的QAction,但在我的情况下最好使用一个,因为用户可以自定义动作的快捷方式,我认为使用相同的多个动作并不是一个好的设计快捷方式和文本等都是相同的,但在不同的小部件上运行。

P.S。:大多数操作都可以通过快捷方式触发(启用小部件上下文,以便小部件无论如何都需要关注),也可以通过该小部件上的自定义上下文菜单触发。

如果有助于理解我的问题,我可以提供一个简单的代码示例:

// init the action etc.
void Widget::init()
{
    QAction *action = new QAction("Do Something");
    action->setShortcut("Ctrl+X");
    action->setShortcutContext(Qt::WidgetShortcut);
    connect(action, SIGNAL(triggered()), SLOT(action_triggered()));

    // assume the widgets 1 to 3 already exist (type QWidget* off course)
    widget1->addAction(action);
    widget2->addAction(action);
    widget3->addAction(action);
}

// SLOT action_triggered()
void Widget::action_triggered()
{
    QWidget *source;
    // TODO: which widget is the source: widget1, widget2 or widget3?
}

1 个答案:

答案 0 :(得分:4)

我认为您可以使用QAction associatedWidgets方法来确定添加了操作的小部件列表。然后,您可以检查当前具有焦点的窗口小部件的此列表。

QList <QWidget *> widget_list = sender()->associatedWidgets();

for(int i = 0; i != widget_list.size(); ++i) {
    if (widget_list.at(i)->hasFocus()){
        sourceWidget = widget_list.takeAt(i);
        break;
    }
}