RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1474367
Accepted
Eugeny  Shtanov
Eugeny Shtanov
Asked:2022-12-05 23:17:50 +0000 UTC2022-12-05 23:17:50 +0000 UTC 2022-12-05 23:17:50 +0000 UTC

QTableView 和 QEventLoop 中的上下文菜单

  • 772

我以标准方式创建上下文菜单:

        QMenu contextMenu(tr("Context menu"), this);
        QAction action1(tr("Копировать"), this);
        QAction action2(tr("Выделить все"), this);

        contextMenu.addAction(&action1);
        contextMenu.addAction(&action2);

        contextMenu.exec(mapToGlobal(pos));

但是弹出的窗口原来是模态的——它会阻塞流程,直到我选择某些东西或取消菜单的打开,例如,使用按钮Esc。
我使用 QEventLoop,它允许我在一个线程中处理用户事件并执行一些其他简单的操作——处理文件、简单的重复计算。
试图强制菜单是非模态的:

contextMenu.setWindowModality(Qt::WindowModality::NonModal);

但之后的菜单停止出现。我也尝试使用

        contextMenu.show();
и
        contextMenu.popup(mapToGlobal(pos));

但这也无济于事。
有谁知道如何使上下文菜单成为非模态菜单,或者为什么contextMenu.setWindowModality(Qt::WindowModality::NonModal);菜单在强制安装后停止出现?
QEventLoop我用的是PavelK的方法,没有问题。

c++
  • 3 3 个回答
  • 42 Views

3 个回答

  • Voted
  1. needKVAS
    2022-12-06T14:25:44Z2022-12-06T14:25:44Z

    exec()Qt 中的方法以相同的方式工作。他们在自己内部创建QEventLoop并等待它的插槽在特定条件下被调用quit()。这个想法类似于我在您的链接中看到的那个。

    同时,本地的QEventLoop将所有事件传送到它们的目的地。

    为什么exec()它会阻止您的方法的执行?

    不幸的是,没有看到你的代码,我只能猜测,但你可能正在等待你的方法退出你的 QEventLoop,而它被 中断QEventLoop,这在exec(). 因此,直到方法QEventLoop退出时才会退出。QEventLoopexec()

    因此,菜单的模态与它无关。此外,QMenu 是默认的NonModal,这意味着调用contextMenu.setWindowModality(Qt::WindowModality::NonModal);不应该改变程序的工作方式。

    要解决此问题,您应该尽可能使用常规事件和信号/插槽。本地人QEventLoop甚至会在运行时交付它们QMenu::exec()。该应用程序也有自己的QEventLoop,它将在调用 app.exec() 时启动,并将负责在其余时间传递事件。

    为什么它不起作用QMenu::popup?

    该调用popup是“异步的”(准确地说,它只会在应用程序开始处理事件时产生可见的效果)。调用之后,程序继续执行,对象QMenu超出作用域就被销毁,你甚至没有时间去看它。您可以使用new 查看答案来解决此问题。.

    show()根本不应该用于QMenu.

    • 2
  2. Best Answer
    Alexander Chernin
    2022-12-06T00:10:09Z2022-12-06T00:10:09Z

    这是它工作正常的方式:

    MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
    
        ui->tableView->setContextMenuPolicy(Qt::CustomContextMenu);
        connect(ui->tableView, &QTableView::customContextMenuRequested, [&](const QPoint& pos) {
            static QMenu* menu = nullptr;
    
            if (!menu) {
                menu = new QMenu();
                menu->addAction(new QAction("Action 1", this));
                menu->addAction(new QAction("Action 2", this));
                menu->addAction(new QAction("Action 3", this));
            }
            menu->popup( mapToGlobal(pos) );
        });
    }
    
    • 1
  3. Eugeny Shtanov
    2022-12-06T15:52:20Z2022-12-06T15:52:20Z

    它是如何为我工作的:

        QMenu *m_contextMenu = nullptr;
        QAction *m_action1 = nullptr, *m_action2 = nullptr;
    

    ...

    connect(this, &QTableView::customContextMenuRequested,
        [&] (const QPoint &pos) {
        if (!m_contextMenu) {
            m_contextMenu = new QMenu(tr("Context menu"), this);
    
            if (!m_action1) {
                m_action1 = new QAction(tr("Копировать"), this);
                connect(m_action1, &QAction::triggered, this, &MyTableView::copyRow);
            }
    
            if (!m_action2) {
                m_action2 = new QAction(tr("Выделить все"), this);
                connect(m_action2, &QAction::triggered, this, &QAbstractItemView::selectAll);
            }
    
            m_contextMenu->addAction(m_action1);
            m_contextMenu->addAction(m_action2);
        }
        m_contextMenu->popup(mapToGlobal(pos));
    });
    

    static不适合我,因为 我正在使用多个表。因此,有必要取出一个班级的所有成员。

    • 0

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5