Здравствуйте! Не давно начал изучать Qt и не как не могу понять как установить КМ на элементы QListWidget, если можно дайте пример.
Краткая экскурсия:
В 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
У меня вопрос как раз по контекстному меню на 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);
}
ответ на вопрос нашел. можно закрывать!
Надо было не кнопку создавать, а объект QAction, затем добавить этот элемент в toolBar, а там уже можно извращаться с кнопкой как угодно душе.
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)