Есть вопрос?
Зайди на форум

Поиск на сайте: Advanced

Denix - новый дистрибутив Linux. Русификация Ubuntu и установка кодеков

dkws.org.ua
Форум сайта dkws.org.ua
 
Главная    ТемыТемы    АльбомАльбом    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

MDI приложение с листа

 
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Конкурс
 
Автор Сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Чт Фев 21, 2008 4:02 pm    Заголовок сообщения: MDI приложение с листа
Ответить с цитатой

MDI приложение с листа

Автор: Щербаков Антон Юрьевич
Мыло: krow at original-auto.ru

В этой статье я расскажу о том, как можно сделать приложение без использования дизайнера форм.
Для начала унаследуем наш новый класс от QMainWindow.
Главным в будущем приложении будет объект типа QWorkspace, его то мы и делаем главным после объявления:

Код:
workspace = new QWorkspace;
setCentralWidget(workspace);


После необходимо создать меню, действия которые будут выполняться при нажатии на меню. За это отвечают созданные нами процедуры createActions(), createMenus():

Код:
1 void mainWindow::createActions()
2 {
3   actQuit = new QAction(tr("Quit"), this);
4   actQuit->setShortcut(tr("Ctrl+Q"));
5   actQuit->setStatusTip(tr("Quit program"));
6   connect (actQuit, SIGNAL(triggered()), this, SLOT(close()));
7   
8   actWidget = new QAction(tr("Widget"), this);
9   actWidget->setStatusTip(tr("Is a sample create widget"));
10   connect (actWidget, SIGNAL(triggered()), this, SLOT(actWidgetClicked()));
11 }


все элементы класса QAction объявляем в хеадере. В строках 3 и 8, мы создаём новый "действия". При объявлении класс принимает 2 параметра: 1) это текстовая часть которая будет отображаться пользователю 2) указывается область где будет создаваться новый объект (в данном случае это workspace). Каждому действию можно назначить "горячие клавиши", делается это методом setShortcut(), как показано в строке 4. В строках 5 и 9 мы устанавливаем текстовое сообщение которое будет выводиться в статусбаре, при наведении в меню на это действие. Чтобы наши action`сы возымели действие их нужно соединить с соответствующими слотами (строки 6 и 10). Следует обратить внимание что в первом коннекте используется стандартный слот close(), закрывающий наше приложение. А во втором действие соединено со слотом который мы сами создали (обявляется в хеадере в разделе public slots или private slots), но этому слоту мы вернёмся чуть позже. Сигнал отвечающий за нажатие action`са - triggered().

Код:
1 void mainWindow::createMenus()
2 {
3   menuFile =  new QMenu;
4   menuFile = menuBar()->addMenu(tr("File"));
5   menuFile->addAction(actQuit);
6   
7   menuWidget = new QMenu;
8   menuWidget = menuBar()->addMenu(tr("Widget"));
9   menuWidget->addAction(actWidget);
10 }


Здесь также все объекты класса QMenu объявляются в хеадере. В строчках 4 и 8 мы добавляем новое меню. К вновь созданному меню мы добавляем action`сы методом addAction() (строки 5 и 9).
Теперь переходим к слоту actWidgetClicked()

Код:
1 void mainWindow::actWidgetClicked()
2 {
3   QWidget *widget = new QWidget(this);
4   QTextBrowser *tb = new QTextBrowser(widget);
5   QPushButton *pbClose = new QPushButton(tr("Close widget"),widget);
6   connect (pbClose, SIGNAL(clicked()), this, SLOT(close()));
7   
8   QVBoxLayout *vLayout = new QVBoxLayout(widget);
9   vLayout->addWidget(tb);
10   vLayout->addWidget(pbClose);
11   workspace->addWindow(widget);
12   widget->show();
13 }


Для начала создаём полотно, на котором будем ваять дочернюю форму (widget, строка 3). Строки 4 и 5 создают текстовый браузер, и кнопку которая будет закрывать дочернюю форму. Её соединяем так же со слотом close() (здесь он закрывает только дочернюю форму так как parent = widget). На строчке 8 остановимся поподробнее. QVBoxLayout это менеджер рамещения виджетов по вертикали. Удобен тем что она сам следит за изменениями размеров формы. Существуют также менеджеры горизонтальный(QHBoxLayout) и табличный (QGridLayout). Для добавления виджета к лайоуту используется метод addWidget() (строки 9 и 10). Для добаления уже имеющегося лайоута в новый лайоут является метод addLayout().
Для того чтобы наша форма открывалась в MDI приложении а не отдельным окном мы её добавляем к нашему workspace методом addWindow() (строка 11). Ну и методом show() мы отображаем для пользователя вновь созданную форму.

Наше приложение:



Последний раз редактировалось: den (Вс Фев 24, 2008 7:54 am), всего редактировалось 2 раз(а)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
jeder

Почетный флеймер


Зарегистрирован: 08.06.2007
Сообщения: 1387

СообщениеДобавлено: Пт Фев 22, 2008 2:52 am    Заголовок сообщения:
Ответить с цитатой

Ого Shocked
Класс. И любую программу так написать можно?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
den

Старожил


Зарегистрирован: 31.01.2006
Сообщения: 13870
Откуда: Кировоград, Украина

СообщениеДобавлено: Пт Фев 22, 2008 6:29 am    Заголовок сообщения:
Ответить с цитатой

jeder, да, если хватит терпения ))
Вернуться к началу
Посмотреть профиль Отправить личное сообщение dhsilabs@jabber.ru
Krow

Злостный хелпер


Зарегистрирован: 09.06.2006
Сообщения: 324
Откуда: Краснодар->Ейск

СообщениеДобавлено: Пт Фев 22, 2008 8:56 am    Заголовок сообщения:
Ответить с цитатой

jeder писал(а):
Ого Shocked
Класс. И любую программу так написать можно?

Да, все свойства designer`a это графическое отображение текстовых методов.
файл формы .ui при комиляции переводится в хеадер ui_*.h. гляньте любым текстовым редактором и вы увидите все эти методы, как и что делается.
Я дал пример как с листа написать приложение без дизайнера, чтобы вы поняли принцип работы с Qt. Wink
_________________
если вы чего то не знаете то не значит что этого нет.
разработчики никогда не бывают не правы!
Вернуться к началу
Посмотреть профиль Отправить личное сообщение ICQ Number
Показать сообщения:   
Начать новую тему Ответить на тему    Список форумов dkws.org.ua -> Конкурс Часовой пояс: GMT
Страница 1 из 1
 Главная страница сайта
 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
© Колисниченко Денис