Как найти элемент, выбранный из customContextMenuRequested () для элемента QTreeView? - PullRequest
4 голосов
/ 19 апреля 2010

Я реализовал контекстные меню в элементах QTreeView со следующим кодом

MyDerivedQTreeView->setModel(MyDerivedQAbstractItemModel);
MyDerivedQTreeView->setContextMenuPolicy(Qt::CustomContextMenu);  
connect(MyDerivedQTreeView,   
        SIGNAL(customContextMenuRequested(const QPoint &)),   
        MyDerivedQAbstractItemModel(),   
        SLOT(contextualMenu(const QPoint &)));

void MyDerivedQAbstractItemModel::contextualMenu(const QPoint& point)
{
    QMenu *menu = new QMenu;
    menu->addAction(QString("Test Item"), this, SLOT(test_slot()));
    menu->exec(MyDerivedQTreeView->mapToGlobal(point));
}

MyDerivedQAbstractItemModel :: contextualMenu () вызывается, и я вижу контекстное меню.

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

Как узнать, выбран ли какой-либо элемент из информации QPoint? Я на Qt 4.5.3.

Ответы [ 3 ]

13 голосов
/ 19 апреля 2010

Может быть, вы могли бы использовать метод indexAt () в QTreeView, чтобы получить элемент, по которому осуществляется щелчок, перед построением пользовательского меню.

2 голосов
/ 19 апреля 2010

Может быть, этот код поможет вам:

==> dialog.h <== </p>

QStandardItemModel *model;
QSortFilterProxyModel *proxyModel;
QTreeView *treeView;

==> dialog.cpp <== </p>

void    CImportTabWidget::createGUI() {
    ...
    proxyModel = new QSortFilterProxyModel;
    proxyModel->setDynamicSortFilter(true);

    treeView = new QTreeView;
    treeView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    treeView->setRootIsDecorated(false);
    treeView->setAlternatingRowColors(true);
    treeView->setModel(proxyModel);

    model = new QStandardItemModel(0, 4);
    model->setHeaderData(0, Qt::Horizontal, tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, tr("Comment"));
    model->setHeaderData(2, Qt::Horizontal, tr("Size"));
    model->setHeaderData(3, Qt::Horizontal, tr("Date"));

    fillTreeViewData();

    proxyModel->setSourceModel(model);
    ...
}
//////////////////////////////////////////////////////////////////////////
void    CImportTabWidget::createMenus() {

    treeView->setContextMenuPolicy(Qt::CustomContextMenu);

    connect(treeView,
        SIGNAL(customContextMenuRequested(const QPoint &)),
        this,
        SLOT(contextMenu(const QPoint &)));
}
//////////////////////////////////////////////////////////////////////////
void    CImportTabWidget::contextMenu(const QPoint &widgetXY) {

    Q_UNUSED(widgetXY);

    QMenu menu(this);

    /* Условия для меню */
    deleteAct->setEnabled((!model->rowCount()) ? false : true );
    deleteAllAct->setEnabled((!model->rowCount()) ? false : true );

    /* Находим индекс */
    QModelIndex index = treeView->currentIndex();
    QString fileName = model->data(model->index(index.row(), 0)).toString();

    if (!fileName.isEmpty()) {
        importAct->setText(tr("Import %1").arg(fileName));
        //deleteAct->setText(tr("Delete %1").arg(fileName));
    }

    /* Формируем меню */
    menu.addAction(deleteAct);
    menu.addAction(deleteAllAct);

    menu.exec(QCursor::pos());
}

Удачи!

0 голосов
/ 12 июля 2012

Функция QTreeWidget :: currentItem () возвращает элемент, по которому щелкнули правой кнопкой мыши. Не ясно, что это происходит на основе описания, но на основе моего использования, это то, что он делает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...