Russian Qt Forum
Октябрь 01, 2024, 14:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt 4.2.0 Помогите новичку  (Прочитано 3843 раз)
Kuzemko
Гость
« : Февраль 08, 2007, 08:46 »

Есть класс главного меню и класс для менеджера проекта, который состоит из QTabWidget на котором создано QTreeWidget а потом четыре QTreeWidgetItem(Описание проекта, Настройка проекта, Схема эл. принцип. и Печатная плата). Научился добавлять в Схему и Печатную платы новые элементы при помощи QAction, которые определены в классе главного окна.
Есть желание создать для каждого QTreeWidgetItem контенкстное меню. Хотел с mouseMoveEvent, но для  QTreeWidgetItem он не реализован. Грустный
Сейчас пытаюсь сделать так
Код:
void Explorer::contextMenuEvent(QContextMenuEvent* event)
{
if (projectShematic->isSelected())
{
// тут должно быть конт. меню для Схем
}
if (projectPCB->isSelected())
{
// тут должно быть конт. меню для Печатных плат
}
}

Так вот в чем вопрос, как мне создать в contextMenuEvent конт. меню с QAction (они в определяються в конструкторе главного окна)
Код:

MainWindow::MainWindow()
{
// создаем рабочее окно с менеджером проекта
explorer = new Explorer;
QWorkspace *workspace = new QWorkspace;
QSplitter *mainSplitter= new QSplitter(Qt::Horizontal);
mainSplitter->addWidget(explorer);
mainSplitter->addWidget(workspace);
mainSplitter->setStretchFactor(1,1);
setCentralWidget(mainSplitter);
// end создаем рабочее окно с менеджером проекта
createActions();
createMenus();
//createContextMenu();
createToolBars();
createStatusBar();
}
...
void MainWindow::createActions()
{
...
newShematic = new QAction(tr("Создать новую схему"), this);
newShematic->setIcon(QIcon(":/images/new.png"));
newShematic->setShortcut(tr("Ctrl+H"));
newShematic->setStatusTip(tr("Создать новую схему электрическую принципиальную"));
connect(newShematic, SIGNAL(triggered()), explorer, SLOT(addNewShematic()));

newPCB = new QAction(tr("Создать новую печатную плату"), this);
newPCB->setIcon(QIcon(":/images/open.png"));
newPCB->setShortcut(tr("Ctrl+B"));
newPCB->setStatusTip(tr("Создать новую печатную плату"));
connect(newPCB, SIGNAL(triggered()), explorer, SLOT(addNewPCB()));
...
}


Помогите, буду очень благодарен. :lol:
Записан
alex12
Гость
« Ответ #1 : Февраль 08, 2007, 22:51 »

По-моему, здесь есть несколько вариантов разных степеней удобства/грамотности:

1) Если это одна единая немасштабируемая программа: самый тупой вариант -- объявить глобальную переменную типа MainWindow*. Тогда из любого места проекта будет доступ к всем переменным всего-чего-можно. Это путь в стиле "C" и для ООП, конечно, смотрится топорно. Но работает эффективно.
Код:

main.c:
  MainWindow *mainwindow;
main.h:
  extern MainWindow *mainwindow;

2) Везде в иерархии классов передавать ссылки на соответствующие классы, т.е. объявить:
Код:

class Explorer( MainWindow *parent = 0 )
{
...
}

Код:

explorer = new Explorer(this);

3) Предыдущий вариант плох тем, что MainWindow и Explorer завязываются друг на друга. Чтобы этого избежать, можно сделать передачу в конструкторе ссылок на все необходимые QAction:
Код:

class Explorer( QAction *act1=0, QAction *act2=0, QAction *act3=0 ... )

---------------------------------------------------
Кстати, Explorer -- это же наследник какого-то Qt-класса. Поэтому грамотнее написать не
Код:

  explorer = new Explorer;


Код:

explorer = new Explorer(this);

При этом констктор самого класса делать так:
Код:

class Explorer : QWidget
{
Q_OBJECT
public:
  Explorer( QWidget *parent = 0 );
};

Explorer::Explorer( QWidget *parent  )
  : QWidget( parent ) // ЗДЕСЬ ПЕРЕДАЕМ ССЫЛКУ НА РОДИТЕЛЯ
{
}

При таком подходе Qt сама заботится об уничтожении Explorer при уничтожении родителя. Никаких delete не нужно.

Может кто-нибуть подскажет еще чего более грамотное.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 21.