Как сделать так, чтобы контекстное меню исчезло без сбоев приложения?

Пожалуйста, взгляните на эту картинку:

введите описание изображения здесь

Вы можете увидеть QTableView с некоторым глупым контентом и контекстным меню в центре. Моя проблема заключается в том, что если я щелкаю представление таблицы (независимо от того, какая кнопка была нажата), когда это контекстное меню включено (и я ожидаю, что контекстное меню исчезнет, ​​как это происходит в программе Windows, а затем снова появится в новом месте, если нажать правую кнопку). был нажат) моя программа сразу вылетает. Я создаю это так:

 connect(tableView, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(showContextMenu(const QPoint&)));

void MainWindow :: showContextMenu(const QPoint &_point)
{
QPoint      pos   = tableView->mapToGlobal(_point);
QModelIndex index = tableView->currentIndex();
int         row   = index.row();

QMenu menu;
menu.addAction("Test 1");
menu.addAction("Test 2");

QAction *action =  menu.exec(pos);
QString text    = action->text();

if (text == "Test 1")
qDebug("Test 1");
else
if (text == "Test 2")
qDebug("Test 2");
else
qDebug("Vzdroch");
}

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

Я понимаю, что вам может быть очень трудно выяснить, почему это происходит, поэтому я немного ослаблю свой вопрос. Есть ли способ заставить это контекстное меню исчезнуть, когда мышь выходит за пределы его области? Там есть сигнал с именем hovered() в Qt. Он излучается, когда пользовательская мышь находится над виджетом, поэтому я искал сигнал, давайте назовем его unhovered(), выдается, когда пользователь убирает мышь с виджета. К сожалению, мне не удалось найти такой сигнал. Есть ли способ сообщить моей программе, что мышь выключена?

Надеюсь, я полностью описал свою проблему.

0

Решение

QMenu::exec возвращает 0, если пункт меню не был выбран.

Вам нужно проверить action перед разыменованием, иначе вы разыменуете нулевой указатель, который ведет к неопределенному поведению.

QAction *action =  menu.exec(pos);
if (!action) {
qDebug() << "no menu selected";
} else {
QString text  = action->text();
...
}
3

Другие решения

Других решений пока нет …