Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.09.2011, 16:01   #1
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
Вопрос Многоуровневое меню

Всем привет!

Вопрос следующий

Необходимо сделать многоуровневое меню, т.е.

Пункт 1 ->
------------Пункт 1 1
------------Пункт 1 2
Пункт 2 ->
------------Пункт 2 1
Пункт 3

Данное меню есть контекстное по отношению к QTreeWidget, т.е.
Код:
QAction *pactAdd = new QAction(tr("Add"), this);
QAction *pactDel = new QAction(tr("Del"), this);

ui->treeWidget->addAction(pactAdd);
ui->treeWidget->addAction(pactDel);
Задача вроде бы стандартная (в C# даже не думаешь над её решением))
Но в Qt я не смог, даже покопавшись, сделать такое

Кто-то может навести на мысль?
Буду благодарен за любые советы
Lindemann66 вне форума Ответить с цитированием
Старый 22.09.2011, 20:01   #2
xwicked
Участник клуба
 
Аватар для xwicked
 
Регистрация: 21.03.2010
Сообщений: 1,508
Лампочка Qt = Qt, C# = C#

Уважаемый, Lindemann66! Хотите настоящую кроссплатформенность? - используйте Qt и наследуйте объекты...

Заголовочник:
Код:
#ifndef _MenuText_h_
#define _MenuText_h_
#include <QtGui>

class FTextBook : public QTextEdit {//Необходимо наследовать от QTreeWidget
      Q_OBJECT

private:
        QMenu *MenuText;

public:
       FTextBook(QWidget *pwgt = 0);

protected:
       virtual void contextMenuEvent(QContextMenuEvent *event);

signals:
       void sUndo();

public slots:
       void slotUndo();

};
#endif // _MenuText_h_
Реализация:
Код:
#include "MenuText.h"
#include <QtGui>

FTextBook::FTextBook(QWidget *pwgt /* = 0*/) : QTextEdit(pwgt)
     {
       MenuText = new QMenu(this);
       MenuText->addAction(QPixmap(":/toolbar/toolbar/undo.png"), tr("Undo"),this, SLOT(slotUndo()), Qt::CTRL + Qt::Key_Z);
       MenuText->addAction(QPixmap(":/toolbar/toolbar/redo.png"), tr("Redo"),this, SLOT(slotRedo()), Qt::CTRL + Qt::SHIFT + Qt::Key_Z);
       MenuText->addSeparator();
       MenuText->addAction(QPixmap(":/toolbar/toolbar/select-all.png"), tr("Select all"),this, SLOT(slotSelectAll()), Qt::CTRL + Qt::Key_A);
       MenuText->addSeparator();
       MenuText->addAction(QPixmap(":/toolbar/toolbar/cut.png"), tr("Cut"),this, SLOT(slotCut()), Qt::CTRL + Qt::Key_X);
       MenuText->addAction(QPixmap(":/toolbar/toolbar/copy.png"), tr("Copy"),this, SLOT(slotCopy()), Qt::CTRL + Qt::Key_C);
       MenuText->addAction(QPixmap(":/toolbar/toolbar/paste.png"), tr("Paste"),this, SLOT(slotPaste()), Qt::CTRL + Qt::Key_V);
     }

/*virtual*/ void FTextBook::contextMenuEvent(QContextMenuEvent *event)
{
   MenuText->exec(event->globalPos());
}

void FTextBook::slotUndo()
{
   emit sUndo();
}
Цитата:
QMenu Class Reference
[QtGui module]


QAction * addAction ( const QIcon & icon, const QString & text, const QObject * receiver, const char * member, const QKeySequence & shortcut = 0 )
void addAction ( QAction * action )
QAction * addMenu ( QMenu * menu )
QMenu * addMenu ( const QString & title )
QMenu * addMenu ( const QIcon & icon, const QString & title )
В помощь.

ЗЫ: ... или используйте C# и возмущаться не нужно будет
Цитата:
в C# даже не думаешь над её решением)
Google - лучший помощник программиста.
---
моя лаборатория | мой FaceBook

Последний раз редактировалось xwicked; 22.09.2011 в 20:25.
xwicked вне форума Ответить с цитированием
Старый 23.09.2011, 08:33   #3
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
По умолчанию

Большущее спасибо обязательно попробую этот способ
Lindemann66 вне форума Ответить с цитированием
Старый 23.09.2011, 16:17   #4
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
По умолчанию

Сделал немного иначе, как мне удобней...

И появилась проблема

Создаю
private:
QMenu m_menu;

и потом, когда нажимаю на дерево, вызывается слот показа контекстного меню
Код:
void SettingsForm::showSitesContextMenu(QPoint pos) {
    QPoint new_pos = pos;
    //new_pos.setX(pos.x() + ui->treeWidget->x() + 2);
    //new_pos.setY(pos.y() + ui->treeWidget->y() + 24);

    m_SitesContextMenu->exec(mapToGlobal(new_pos));
}
И вот незадача - середина меню (вертикальная) появляется как раз на месте нажатия мыши
То есть, меню отображается по смещённой координате, причём определённо по середине, т.е.


Кто-то сталкивался с подобной проблемой неправильного позиционирования меню?
Lindemann66 вне форума Ответить с цитированием
Старый 23.09.2011, 16:29   #5
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
По умолчанию

Так, прошу прощения, сам решил проблему
Код:
m_SitesContextMenu->exec(QCursor::pos());
Lindemann66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многоуровневое дропдаун меню Ky3Heu, Общие вопросы Delphi 4 30.06.2011 12:29
Многоуровневое рисование. Alex Cones Win Api 2 11.10.2010 20:54
Многоуровневое меню по данному css коду Vladimirko HTML и CSS 0 26.08.2010 01:11
MainMenu многоуровневое *Devil* Общие вопросы Delphi 1 18.06.2007 00:05