gpt4 book ai didi

c++ - 使用当前焦点小部件上下文菜单自动填充菜单栏中的 "Edit"菜单

转载 作者:行者123 更新时间:2023-11-30 04:33:26 25 4
gpt4 key购买 nike

我一直在寻找实现 Qt 应用程序“编辑”菜单的方法。 “编辑”菜单包含“复制”、“剪切”、“粘贴”等项目,需要转发到当前事件的小部件。

我似乎无法找到一种标准或优雅的方式来做到这一点。根据这个问题,这是不可能的:

How to implement the "Edit" menu with "Undo", "Cut", "Paste" and "Copy"?

我最近想在显示“编辑”菜单时在当前事件的小部件上触发上下文菜单事件,通过:

// create menus in MainWindow constructor
...
edit_menu = menuBar()->addMenu(tr("&Edit"));
connect(edit_menu, SIGNAL(aboutToShow()), this, SLOT(showEditMenu()));
...

// custom slot to handle the edit menu
void MainWindow::showEditMenu()
{
QWidget* w = QApplication::focusWidget();

// show the context menu of current focus widget in the menubar spot
QPoint global_pos = edit_menu->mapToGlobal(edit_menu->rect().bottomLeft());
QPoint pos = w->mapFromGlobal(global_pos);

QApplication::sendEvent(w, new QContextMenuEvent(QContextMenuEvent::Keyboard, pos, global_pos));
}

这很好地显示了当前小部件的上下文菜单,但存在一些问题。例如,它将焦点从菜单栏移​​开,或者如果您先单击不同的菜单栏项,菜单栏就会获得焦点,等等。

一个部分解决方案是从小部件中获取上下文菜单并将其项目动态复制到编辑菜单中。有办法做到这一点吗?

有没有更好的方法在 Qt 中构建编辑菜单?

感谢您的帮助。

最佳答案

好吧,如果您只需要创建菜单,您始终可以从小部件的 actions 中执行操作。要为小部件创建编辑操作,您可以执行以下操作:

void MainWindow::addActions (QWidget* widget)
{

QAction * copyAction = new QAction("copy",widget);
if(connect(copyAction,SIGNAL(triggered()),widget,SLOT(copy())))
{
widget->addAction(copyAction);
qDebug()<<"success connection";
}
}

foreach (QObject * obj, centralWidget()->children())
{
QWidget * w = dynamic_cast<QWidget*>(obj);
if (w)
addActions(w);
}

然后你总是可以用焦点小部件的 Action 更新编辑菜单的 Action

这可能不优雅,但总比不可能好。示例中的主要错误假设是复制槽名为 copy

关于c++ - 使用当前焦点小部件上下文菜单自动填充菜单栏中的 "Edit"菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6861722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com