Qt 可检查 QAction

Qt Checkable QActions

我在右键菜单中有两个 QAction。我正在尝试检查一个动作并在它旁边显示一个勾号。当检查肯定时,如果我第二次检查肯定,它应该 return 程序进入默认模式并删除勾号。如果在肯定之后检查否定,则刻度线应移动到否定。我修改了类似的问题,但我无法弄清楚。我会很感激你的帮助。

  void MainInterfaceWindow::ShowContextMenu(const QPoint &pos)
  {    
    QMenu contextMenu(tr("Context menu"), this);
    QAction action1("Positive", this);
    QAction action2("Negative", this);
    contextMenu.addAction(&action1);
    contextMenu.addAction(&action2);
    connect(&action1, SIGNAL(triggered()), this, SLOT(positiveSlope()));
    connect(&action2, SIGNAL(triggered()), this, SLOT(negativeSlope()));
    m_mouseLocation=pos;
    contextMenu.exec(mapToGlobal(pos));
}

void MainInterfaceWindow::positiveSlope()
{
    ui->openGLWidget->m_positive_slope=true;
    ui->openGLWidget->m_negative_slope=false;
}

void MainInterfaceWindow::negativeSlope()
{   
    ui->openGLWidget->m_negative_slope=true;
    ui->openGLWidget->m_positive_slope=false;
}

您确实必须按照您说的去做:取消选中其他操作。由于操作特定于给定的上下文菜单,因此您应该捕获它们。 IIRC,每次你点击它们时,这些动作都会自动选中和取消选中,所以这应该已经发生了,不需要任何额外的代码。

必须使操作可检查:默认情况下它们不是。

最好不要重新进入事件循环,即不要在任何地方使用 exec 方法,而是在每个线程的根事件循环(包括主线程,事件循环所在的位置)由 QCoreApplication::exec) 开始。

在下面的代码中,连接通常在两个对象之间进行,因此如果源对象或目标对象被销毁,仿函数也会被销毁 - 通过构造确保仿函数在任何情况下都无法访问操作指针他们在晃来晃去。此外,由于上下文菜单请求处理程序函子使用 m_mouseLocation,该字段必须位于 m_contextMenu 之前,以通过构造确保函子在析构后不会访问该成员。

class MainInterfaceWindow : public ... {
  QPoint m_mouseLocation; // must be before m_contextMenu
  QMenu m_contextMenu{this};
  ...
  void setupContextMenu();
};

MainInterfaceWindow::MainInterfaceWindow(QWidget *parent) :
  BaseClass(..., parent)
{
  setupContextMenu();
  ...
}

void MainInterfaceWindow::setupContextMenu()
{
  m_contextMenu.setTitle(tr("Context menu");
  setContextMenuPolicy(Qt::CustomContextMenu);
  connect(this, &QWidget::customContextMenuRequested, &m_contextMenu, [=](const QPoint &pos){
    m_mouseLocation = pos;
    contextMenu.popup(mapToGlobal(pos));
  });
  auto *posAction = new QAction(tr("Positive"));
  auto *negAction = new QAction(tr("Negative"));
  for (auto *action : {posAction, negAction}) {
    action->setCheckable(true);
    m_contextMenu.addAction(action);
  }
  connect(posAction, &QAction::triggered, negAction, [=]{
    negAction->setChecked(false);
    ui->openGLWidget->m_positive_slope = posAction->checked();
    ui->openGLWidget->m_negative_slope = negAction->checked();
  });
  connect(negAction, &QAction::triggered, posAction, [=]{
    posAction->setChecked(false);
    ui->openGLWidget->m_positive_slope = posAction->checked();
    ui->openGLWidget->m_negative_slope = negAction->checked();
  });
}