Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ контекстное меню на элемент QListWidget

Автор: Kostya 19.8.2014, 5:42

Здравствуйте! Не давно начал изучать Qt и не как не могу понять как установить КМ на элементы QListWidget, если можно дайте пример.

Автор: Litkevich Yuriy 21.8.2014, 11:04

Краткая экскурсия:
В Qt, меню и панели инструментов строятся на основе НЕвизуальных классов - http://www.doc.crossplatform.ru/qt/4.6.x/qaction.html#details, которые описывают действие (например, "Копировать").
Затем действия связываются с неким визуальным объектом, например, http://www.doc.crossplatform.ru/qt/4.6.x/qmenu.html#details.

Для произвольного виджета, можно установить контекстное меню следующим образом:
1) Создать нужные действия
2) Связать эти действия с виджетом, с помощью его метода http://www.doc.crossplatform.ru/qt/4.6.x/qwidget.html#insertAction
3) Задать http://www.doc.crossplatform.ru/qt/4.6.x/qt.html#ContextMenuPolicy-enum равную Qt::ActionsContextMenu, чтобы контекстное меню отображало все связанные с виджетом действия.

В качестве живого примера рекомендую изучить демку %QTDIR%/demos/sqlbrowser
Тебе нужно изучить ConnectionWidget, он содержит QTreeWidget, являющися родственным для QListWidget

Автор: asket 21.8.2014, 13:22

У меня вопрос как раз по контекстному меню на QTreeWidget.
В главном окне MainWindow в доке mainToolBar создал кнопку QToolButton, которая проваливается внутрь и держится в таком состоянии до повторного нажатия, в качестве CentralWidget я создал объект собственного класса производного от QTreeWidget, в нем контекстное меню, но почему же при выборе пункта в контекстном меню treeWidget вышеупомянутая кнопка возвращается в исходное состояние (отскакивает)?

Фрагмент кодов:

вставка кнопки QToolButton в mainToolBar

void MainWindow::createToolButtons()
{

    QToolButton *tb = new QToolButton(ui->mainToolBar);
    tb->setPopupMode(QToolButton::InstantPopup);

    m_connectAct = ui->mainToolBar->addWidget(tb);
    m_connectAct->setShortcuts(QKeySequence::New);
    m_connectAct->setStatusTip(tr("Connect"));

}


Этот код создает и вызывает контекстное меню

void MyTreeWidget::on_customContextMenuRequested(const QPoint &pos)
{
    QTreeWidgetItem* item = ui->treeWidget->itemAt(pos);
    QMenu* menu = new QMenu;
    if (item == NULL){

        menu->addAction(tr("Обновить"), this, SLOT(updateFilesListRequest()));
        menu->addAction(tr("Добавить"), this, SLOT(addFiles()));
    }else
    {
        menu->addAction(tr("Сохранить как.."), this, SLOT(saveAsFile()));
        menu->addAction(tr("Удалить"), this, SLOT(deleteFiles()));
        menu->addAction(tr("Переименовать"), this, SLOT(renameFile()));
    }

    QPoint p = ui->treeWidget->/* viewport()-> */mapToGlobal(pos); // ?
    QAction* action = menu->exec(p);
}


буду благодарен за любую помощь.

Автор: asket 21.8.2014, 14:08

ответ на вопрос нашел. можно закрывать!
Надо было не кнопку создавать, а объект QAction, затем добавить этот элемент в toolBar, а там уже можно извращаться с кнопкой как угодно душе.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)