Пожалуйста, взгляните на эту картинку:
Вы можете увидеть 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()
, выдается, когда пользователь убирает мышь с виджета. К сожалению, мне не удалось найти такой сигнал. Есть ли способ сообщить моей программе, что мышь выключена?
Надеюсь, я полностью описал свою проблему.
QMenu::exec
возвращает 0, если пункт меню не был выбран.
Вам нужно проверить action
перед разыменованием, иначе вы разыменуете нулевой указатель, который ведет к неопределенному поведению.
QAction *action = menu.exec(pos);
if (!action) {
qDebug() << "no menu selected";
} else {
QString text = action->text();
...
}
Других решений пока нет …