Вопрос

У меня есть класс QTreeView с контекстным меню, установленным следующим образом:

m_ui.tree->setContextMenuPolicy(Qt::CustomContextMenu);
connect(m_ui.tree, SIGNAL(customContextMenuRequested(const QPoint&)),
        this, SLOT(ShowTreeContextMenu(const QPoint&)));
...
void ShowTreeContextMenu(const QPoint& point)
{
   m_treeContextMenu->exec(m_ui.tree->viewport()->mapToGlobal(point));
}

Однако, когда отображается контекстное меню, QTreeView больше не будет реагировать на щелчки мышью. Нажатие на элемент в QTreeView во время отображения контекстного меню удалит контекстное меню, но не выберет выбранный элемент.

Это особенно дезориентирует при щелчке правой кнопкой мыши по новому элементу, поскольку контекстное меню всплывает над новым элементом, но, поскольку элемент не был выбран, содержимое контекстного меню ссылается на ранее выбранный элемент.

Это было полезно?

Решение

Вы не говорите, какую версию Qt вы используете, но мы обнаружили ту же проблему в Qt4.4.0, она работала в 4.3. Мы сообщили об этом в Trolltech как об ошибке 225615

Это все еще помечено как ожидающее, поэтому в то же время я бы следовал совету Шай перехватить правый клик и сделать выбор самостоятельно.

Другие советы

Возможное решение, которое я не проверял, состояло бы в том, чтобы зафиксировать событие щелчка правой кнопкой мыши, вручную сделать выбор в древовидном представлении и затем вызвать событие родительского щелчка, которое, в свою очередь, активирует контекстное меню.

Создайте подкласс QTreeView и добавьте защищенный метод void contextMenuEvent (событие QContextMenuEvent *); В этом методе вы выполняете QMenu:

class TreeView : public QTreeView{
  Q_OBJECT
public:
  TreeView(QWidget *parent);
  ~TreeView();
protected:
  void contextMenuEvent(QContextMenuEvent *event);
};

void TreeView::contextMenuEvent(QContextMenuEvent *event){
  QMenu menu(this);
  menu.addAction(action1);
  menu.addAction(action2);
  //...
  menu.addAction(actionN);
  menu.exec(event->globalPos());
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top