QT пользовательское контекстное меню
-
12-12-2019 - |
Вопрос
Я создаю приложение QT, которое состоит из вида дерева и веб-просмотров.Когда элемент из вида дерева нажат, он должен загрузить соответствующий URL. Работает нормально .Когда щелкнул правой кнопкой мысль на элементе, появится пользовательское контекстное меню, оно откроется его в новом веб-просмотре.<Сильные> Это также работает .Но моя проблема в том, что он прав, нажав на элемент TreeView, приходит мой контекстное меню, и если я нажимаю его вне всплывающего меню, URL этого элемента загружается.Как решить это .. Помоги мне друзей ..
Вот мое кодирование:
QStandardItem *rootItem = new QStandardItem("Google");
QStandardItem *stackItem = new QStandardItem("Stack Overflow");
QStandardItem *yahooItem = new QStandardItem("Yahoo");
rootItem->appendRow(stackItem);
standardModel->appendRow(rootItem);
standardModel->appendRow(yahooItem);
***// private slot for loading the url if a treeview item is clicked:***
void MainWindow::treeViewClicked(const QModelIndex &index)
{
str = index.data().toString();
if(!(str.isEmpty()) && str=="Google")
{
url = "http://www.google.com";
}
else if (!(str.isEmpty()) && str == "stack Overflow")
{
url = "http://www.stackoverflow.com";
}
else if (!(str.isEmpty()) && str == "Yahoo")
{
url = "http://www.yahoo.com";
}
WebView *wv = dynamic_cast<WebView *>(ui->tabWidget->currentWidget());
wv->load(QUrl(url));
ui->tabWidget->setTabText(ui->tabWidget->currentIndex(),str);
treeView->setModel(standardModel);
**//Creating custom context menu for QtreeView:**
void MainWindow::showContextMenu(const QPoint& point)
{
QList<QAction *> actions;
if(treeView->indexAt(point).isValid())
{
actions.append(m_treeViewAction);
}
else if(actions.count() > 0)
{
QMenu::exec(actions, MainWindow::treeView->mapToGlobal(point));
QModelIndex index = treeView->indexAt(point);
QStandardItem *item = standardModel->itemFromIndex(index);
treeView->setCurrentIndex(index);
treeViewClicked(index);
}
}
. Решение
Для того, что я знаю, ситуация, которую вы описываете, это стандартно с меню контекста в представлениях: при праве щелчка, элемент также выбран.
Если вы хотите другое поведение, вы должны реализовать mousePressEvent
и реализовать поведение, которое вы хотите достичь.
Вот подсказка:
void MyTreeView::mousePressEvent ( QMouseEvent * event )
{
if (event->button() == Qt::LeftButton) {
// set the current item based on event->pos() / deselect if no item
}
else if (event->button() == Qt::RightButton) {
// show context menu for the item / different context menu if no item
}
}
.
Да, вы должны получить класс QtreeView и сделать один из себя.
Я сделал это давно, и я помню это как начальную точку.Теперь я сейчас не помню, если бы мне пришлось переосмыслить все четыре основных события мыши: нажмите, выпуск, перемещение и дублеклик, так как они внутренне связаны.