【问题标题】:How to determine the source of an QAction?如何确定 QAction 的来源?
【发布时间】:2011-08-25 13:53:37
【问题描述】:

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

我看不出有任何方法可以使用 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?
}

【问题讨论】:

    标签: c++ qt widget action


    【解决方案1】:

    我认为您可以使用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;
        }
    }
    

    【讨论】:

    • 谢谢,这会奏效!我看到了 associatedWidgets() 方法,但没有想到 hasFocus() 方法。也许不是解决这个问题的最佳方法,但在我的情况下应该足够快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多