Разрыв контекстного меню Qt в QTreeView - PullRequest
1 голос
/ 06 октября 2008

У меня есть класс 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 во время отображения контекстного меню приведет к удалению контекстного меню, но не выберет выбранный элемент.

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

Ответы [ 3 ]

2 голосов
/ 06 октября 2008

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

1 голос
/ 06 октября 2008

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

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

1 голос
/ 06 октября 2008

Подкласс 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());
}
...