вторник, 6 ноября 2012 г.

Создание меню на форме, QMenu

Для тех кто хочет добавить меню на форму, прошу сюда :)


Вначале как обычно создаём "GUI приложение Qt".
По умолчанию у нас на MainWindow уже есть QMenuBar, т.е. полоса, куда можно добавлять меню. Подключим необходимые классы, в нашем случае это класс меню, класс action (подпункт меню) и класс отладки:

#include <QMenu>
#include <QAction>
#include <QDebug>

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


private:
    void createMenus();


Данный метод соответственно добавляем в ту форму, на которой нам необходимо создавать меню. В нашем случае это файл mainwindow.h.

Ну а теперь определим этот метод. Я вставлю весь исходник с комментариями.
void MainWindow::createMenus()
{
    QMenu * mnFile = new QMenu("File"); // создаём меню Файл
    QMenu * mnEdit = new QMenu("Edit"); // создаём меню Edit
    QMenu * mnService = new QMenu("Service"); // Меню Сервис
    QMenu * mnHelp = new QMenu("Help"); // Меню помощь
    ui->menuBar->addMenu(mnFile); // Добавляем пункты меню в menuBar, т.е. те, которые будут отображаться в гл. окне
    ui->menuBar->addMenu(mnEdit);
    ui->menuBar->addMenu(mnService);
    ui->menuBar->addMenu(mnHelp);
}

Но это лишь меню без каких либо элементов внутри. Добавим один пункт в меню File. Но прежде добавим слот, к которому в дальнейшем и подключим данное меню. Добавим в mainwindow.h слот showMessage()

private slots:
    void showMessage();


Пускай по вызову данного слота в строку отладки выведется какое-нибудь сообщение.
void MainWindow::createMenus()
{
    qDebug() << "menu clicked";
}

Ну и последнее, нам необходимо добавить этот самый пункт в меню File и подключить его к слоту. В качестве конечного пункта меню (вызываемого) в Qt выступает QAction. Его создание и подключение выглядит следующим образом.

void MainWindow::createMenus()
{
    QMenu * mnFile = new QMenu("File"); // создаём меню Файл
    // ----------- здесь добавляем пункт меню и подключаем его к слоту----
    QAction *msgAction = new QAction("show Message",mnFile);
    connect(msgAction, SIGNAL(triggered()), this, SLOT(showMessage()));
    mnFile->addAction(msgAction);
    
    QMenu * mnEdit = new QMenu("Edit"); // создаём меню Edit
    QMenu * mnService = new QMenu("Service"); // Меню Сервис
    QMenu * mnHelp = new QMenu("Help"); // Меню помощь
    ui->menuBar->addMenu(mnFile); // Добавляем пункты меню в menuBar, т.е. те, которые будут отображаться в гл. окне
    ui->menuBar->addMenu(mnEdit);
    ui->menuBar->addMenu(mnService);
    ui->menuBar->addMenu(mnHelp);
}
Не забудьте добавить createMenus() в конструктор класса mainWindow.



3 комментария: