我想知道是否有任何简单/优雅的方法来确定QAction的来源?我的意思是我有一个QAction,它被添加到多个QWidgets (使用QWidget::addAction),当动作的触发信号发出时,我需要知道哪个QWidget是源,因为我需要查询那个特定的小部件。
我看不到使用QAction本身做这件事的任何方法,无论从哪里触发操作,父操作总是相同的。
我必须解决这个问题的想法是保存一个指向活动小部件的全局指针,但在Qt中似乎没有一种优雅的方法来捕获小部件接收焦点时的事件,从而将其设置为活动小部件。
另一种方法是为每个小部件使用不同的QActions,但在我的例子中,最好使用一个,因为用户可以自定义操作的快捷键,我不认为具有相同快捷键和文本等的多个操作是好的设计,这些操作都做相同的事情,但操作不同的小部件。
附注:大多数操作都可以通过快捷方式触发(启用了小部件上下文,因此小部件无论如何都需要焦点),也可以从该小部件上的自定义上下文菜单触发。
我可以提供一个简单的代码示例,如果这有助于理解我的问题:
// 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?
}发布于 2011-05-15 01:10:13
我认为您可以使用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;
}
}https://stackoverflow.com/questions/6003139
复制相似问题