Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ритт от Октябрь 24, 2008, 21:17



Название: "неперекрывающее" контекстное меню
Отправлено: ритт от Октябрь 24, 2008, 21:17
не знаю как это ещё назвать - пусть будет "неперекрывающее" :)

имею примерно такой код (упрощено):
Код:
MyTableWidget::MyTableWidget(QWidget* parent) : QTableView(parent)
{
setEditTriggers(QAbstractItemView::NoEditTriggers);
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::ExtendedSelection);
//...
}

void MyTableWidget::contextMenuEvent(QContextMenuEvent* event)
{
int n = selectionModel()->selectedRows().count();

QMenu* menu = new QMenu(this);

QAction* editRowAction = new QAction(tr("Edit Element"), menu);
// connect(editRowAction, SIGNAL(triggered(bool)), this, SLOT(editElement()));
menu->addAction(editRowAction);

QAction* deleteRowAction = new QAction(tr("Remove Element(s)", "", n), menu);
// connect(deleteRowAction, SIGNAL(triggered(bool)), this, SLOT(removeElement()));
menu->addAction(deleteRowAction);

menu->exec(event->globalPos());
delete menu;
}
реализовывает контекстное меню для выделенных строк таблицы. когда меню отображено, раздражает необходимость кликать где-то вне области меню чтобы оно исчезло...т.е. для выбора какой-то другой строки приходится кликать два раза: первый - чтобы избавиться от отображаемого меню, второй - чтобы создать новое меню для свежевыбранной строки.
пробовал и menu->popup(...) (с соответствующей модификацией кода) - эффект тот же...
сейчас правил базу в гуитулзах (морда на гтк) - обратил внимание, что там нет такой болезни.

у меня пока только одна мысль - повесить на меню ивентФильтер и на потерю фокуса убивать менюшку...хз сработает ли...
что посоветуете?


Название: Re: "неперекрывающее" контекстное меню
Отправлено: Alex03 от Октябрь 25, 2008, 10:12
А если вместо синхронного exec() пользовать асинхронный popup(), c соответствующими прочими изменениями?


Название: Re: "неперекрывающее" контекстное меню
Отправлено: ритт от Октябрь 25, 2008, 10:25
Цитировать
пробовал и menu->popup(...) (с соответствующей модификацией кода) - эффект тот же...
"модификация" - установка флага самоубийства менюшке, уделние delete menu, exec -> popup
/* надо бы ещё попробовать не указывать родителя менюшке */

упд: нулевой родитель ничего не меняет :(
придётся рыться в сорцах...


Название: Re: "неперекрывающее" контекстное меню
Отправлено: explorer.85 от Август 28, 2011, 11:52
Я бы реализовал класс своего контектного меню и рисоал бы его в paintevent вьюхи