上下文菜单适用于子而非父Widget

时间:2014-04-09 15:24:06

标签: c++ qt

我正在开发一个在几个QWidget窗口中显示数据的桌面程序,并且我尝试使用上下文菜单允许用户复制/保存窗口的图像以供其他地方使用。尝试让窗口中出现上下文菜单时,我遇到了一个非常奇怪的错误。我最初使用Qt设计模式为整个窗口(整个Qwidget?)创建on_Plot_customContextMenuRequested(const QPoint &pos)插槽,但这不起作用。当我创建on_SignalPlot_customContextMenuRequested插槽时,它可以完美地工作,但仅适用于特定小部件,它是整个窗口的子集。我为每个插槽使用相同的代码,并且调试输出显示发出单独的窗口小部件上下文菜单请求信号,但不显示整个窗口的信号。有没有办法让它适用于整个窗口?

这两个子窗口小部件占用整个窗口会导致问题吗?我使用网格布局来确保图表随窗口大小调整。

(我展示了设计师布局的图片,但我没有足够的声誉。)

不起作用(整个窗口的代码):

void Plot::on_Plot_customContextMenuRequested(const QPoint &pos)
{
    qDebug()<<"plot context menu requested";
    qDebug()<<pos;

    QMenu* menu=new QMenu();
    menu->addAction(copyWinAct);
    menu->addAction(saveWinAct);

    menu->exec(QCursor::pos());
}

完美地工作(单个情节/小部件的代码):

void Plot::on_SignalPlot_customContextMenuRequested(const QPoint &pos)
{
    qDebug()<<"plot context menu requested";
    qDebug()<<pos;

    QMenu* menu=new QMenu();
    menu->addAction(copyWinAct);
    menu->addAction(saveWinAct);

    menu->exec(QCursor::pos());
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果其他人有这个问题,我找到了解决方案。通过将customContextMenuRequested信号连接到一个插槽,每个子窗口小部件将显示相同的上下文菜单。将整个窗口小部件设置为相同的插槽将使整个窗口以相同的方式运行。我将以下代码添加到类默认构造函数中,并创建了相应的插槽以使一切正常运行。

this->setContextMenuPolicy(Qt::CustomContextMenu);
connect(this,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(contextMenuSlot(QPoint)));

QList<QWidget *> windowChildren=this->findChildren<QWidget *>();

foreach (QWidget *child, windowChildren)
{
    child->setContextMenuPolicy(Qt::CustomContextMenu);
    connect(child,SIGNAL(customContextMenuRequested(QPoint)),this,SLOT(contextMenuSlot(QPoint)));
}

祝其他人解决这个问题,祝你好运。