Qt 在我的窗口的任何位置放置操作

Qt 在我的窗口的任何位置放置操作,qt,Qt,我已经创建了几个放置在上下文菜单中的操作。 现在,我想将这些相同的操作添加到一个小工具栏中。问题是 工具栏应位于垂直布局内(另一个小部件下方) 而不是在一个码头区域。有办法搬家吗 将工具栏添加到自定义位置或将操作放置在另一个容器中?QActions只应添加到菜单和工具栏中 如果我把你放在那里,你会希望QActions可以放在普通的小部件上,对吗 解决方法是实现您自己的QPushButton类。为该类提供一个addAction方法,该方法执行以下操作。它将QAction添加为按钮的成员,将QAct

我已经创建了几个放置在上下文菜单中的操作。 现在,我想将这些相同的操作添加到一个小工具栏中。问题是 工具栏应位于垂直布局内(另一个小部件下方) 而不是在一个码头区域。有办法搬家吗
将工具栏添加到自定义位置或将操作放置在另一个容器中?

QActions
只应添加到菜单和工具栏中

如果我把你放在那里,你会希望
QActions
可以放在普通的小部件上,对吗

解决方法是实现您自己的
QPushButton
类。为该类提供一个addAction方法,该方法执行以下操作。它将
QAction
添加为按钮的成员,将QAction的文本设置为按钮的标签,并将按钮的信号
clicked()
连接到操作的插槽
trigger()

大概是这样的:

void my_button::addAction(QAction* p_action)
{
    if( pAction != NULL )
    {
        m_linked_action = p_action;

        setText(m_linked_action->text());

        connect(this,SIGNAL(clicked()),m_linked_action,SLOT(trigger()));
    }
    else
    {
        assert(false);
    }
}
这只是一个非常粗略的例子。你需要考虑很多事情,比如在移除一个动作时正确地断开信号,等等。您还必须注意对可检查操作和类似操作的特殊处理(按钮也必须可检查,信号必须连接…)。但我认为这是一个很好的开始


备选方案:
除了连接,您还可以重新实现按钮的
mouseReleaseEvent
,并在那里调用
QAction::trigger()
。像这样:

void my_button::mouseReleaseEvent( QMouseEvent* e )
{
    if( e->button() == Qt::LeftButton )
    {
        if(m_linked_action != NULL)
        {
            m_linked_action->trigger();
        }
    }

    QPushButton::mouseReleaseEvent(e);
}
通过这样做,您可以将按钮放置在任何位置,单击按钮时将触发链接操作