Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


Хостинг Портала RusFAQ.ru:
MosHoster.ru - Профессиональный хостинг на Windows 2008

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

Чемпионы рейтинга экспертов в этой рассылке

Hubbitus
Статус: 6-й класс
Рейтинг: 89
∙ повысить рейтинг >>
Micren
Статус: Студент
Рейтинг: 64
∙ повысить рейтинг >>
Лысков Игорь Витальевич
Статус: Профессионал
Рейтинг: 54
∙ повысить рейтинг >>

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 1266
от 25.03.2009, 14:35

Администратор:Dr_Andrew

Нам важно Ваше мнение об этой рассылке.
Оценить этот выпуск рассылки >>




Установка, настройка и работа с QDevelop


Что такое QDevelop?


Несмотря на явные достоинства библиотеки Qt - кроссплатформенность, наличие ясного single-source C++ кода, обилие классов как для построения графического интерфейса пользователя, так и "общего назначения", богатство документации, включая исходные тексты примеров и демонстрационных приложений, поставляемых с библиотекой, в своей 3-й версии Qt была относительно мало популярна в среде программистов (за исключением, разве что Linux-кодеров, не боящихся командной строки), по-видимому, из-за дефицита удобных интегрированных средств разработки (за исключением KDevelop, ориентированного на KDE). С выходом 4-й версии библиотеки ситуация кардинально изменилась: в коммерческой версии Qt появилась возможность её интеграции с Visual Studio, для сторонников общественной лицензии GNU компания Nokia (Qt Software) предоставляет официально бесплатно такой удобный инструмент разработки как Qt Creator. Сочетание средства визуального прое ктирования графического интерфейса пользователя (Qt Designer) и полноценной IDE делает библиотеку средством быстрой разработки приложений (RAD) в среде Windows, составляющим конкуренцию такому известному продукту как Borland Developer Studio, а в среде Linux вообще не имеющим аналогов.


К сожалению, Qt Creator обладает рядом мелких недостатков: визуальное проектирование форм неудобно, т.к. форма перекрывается многочисленными панелями; нет возможности создать C++ класс для уже созданной в Qt Designer формы (можно лишь выбрать при создании проекта опцию Qt Designer Form Class - тогда будет создана и форма, и класс), отсутствуют удобные инструменты для доступа к свойствам созданных классов и форм, генерируемый код не всегда удачен, отсутствует русификация (впрочем, последнее несущественно).


Полностью лишена этих недостатков свободная кроссплатформенная среда разработки для Qt 4 - QDevelop. На момент написания статьи QDevelop поставлялся в виде бинарных файлов для 32-bit Windows (Windows 2000/XP/Vista) и Linux (требует Qt 4.4 и выше, но у автора статьи прекрасно работал и с Qt 4.2). Несмотря на заявленную поддержку Mac OS X и FreeBSD, для этих ОС QDevelop придётся собирать самостоятельно из исходных текстов.


QDevelop на момент написания статьи был доступен в следующих локализациях: французской, немецкой, голландской и русской.


Авторы программы особо подчёркивают, что QDevelop не является версией или ответвлением KDevelop (несмотря на сходство, замечу, не только в названии, но и во внешнем виде), а представляет собой самостоятельную разработку, базирующуюся на независимом коде.


Где взять?


Саму IDE Вы можете скачать по нижеследующим ссылкам:



Кроме того, QDevelop входит в состав некоторых дистрибутивов Linux: Fedora (начиная с 8-й версии дистрибутива; установка командой yum install qdevelop) и Ubuntu (установка командой sudo aptitude install qdevelop).


В операционной системе Linux, являющейся плодом совместного творчества множества независимых разработчиков, привычна ситуация, когда для решения одной сложной задачи используется набор ряда взаимодействующих между собой программ. Именно так работает и QDevelop. Для его нормальной
работы необходимы дополнительные компоненты. К ним относятся:



  • Собственно библиотека Qt 4.x, в частности, такие её компоненты как designer, qmake, lrelease, lupdate;

  • Компилятор (g++ для Linux и MinGW для Windows);

  • Отладчик (gdb);

  • Программа дополнения кода (ctags).


Вышеперечисленные программные решения у пользователей Linux, скорее всего, уже установлены. Для пользователей Windows подобная ситуация поиска зависимостей может быть непривычной, поэтому остановлюсь подробнее на настройке QDevelop для Windows (спасибо шефу, позволившему в очередной раз мучить свой ноутбук)...


Итак, нам необходимо скачать, прежде всего, OpenSource-редакцию Qt 4. Последнюю на момент написания статьи версию Qt (4.5) можно скачать по этой ссылке.


MinGW для Qt требуется 3-й версии, в то время как на сайте разработчиков компилятора выложена актуальная, 5-я версия, которую скачивать не нужно. При установке Qt инсталлятор сам предложит скачать подходящую версию MinGW.


А вот что стоит скачать с сайта MinGW, так это отладчик, gdb. Скачать его можно здесь.


И наконец, архив ec57w32.zip, содержащий в себе исполняемые файлы и исходные тексты ctags.


Установка Qt 4 и MinGW


Если Вы работаете с не слишком старым дистрибутивом, то почти наверняка и Qt, и компилятор g++ у Вас уже установлены. В случае, если Вы работаете с dual-Qt дистрибутивом (т.е. таким, где могут быть установлены как 3-я, так и 4-я версии библиотеки), то проверить наличие 4-й версии библиотеки можно следующей командой: rpm -q qt4


Если соответствующая версия Qt не установлена, то обратитесь к репозитарию Вашего дистрибутива или, как вариант, можете собрать Qt из исходных текстов. Это полезно в том случае, если Вы хотите создать статическую, а не динамическую сборку библиотеки. Я, например, конфигурировал библиотеку со следующими опциями:


./configure -release -static -fast -nomake demos -nomake examples -stl -qt-zlib -qt-gif -qt-libtiff -qt-gif -qt-libpng -qt-libmng -qt -libjpeg
-v -opengl

т.е. библиотека будет создавать исполняемые файлы без включения отладочной информации (-release), будет использовать статическую линковку с разделяемыми библиотеками (-static), не будет компилировать идущие в поставке исходные тексты примеров и демонстрационных приложений (-fast -nomake demos -nomake examples - это полезно, т.к. компиляция может занять полдня даже на неслабом компьютере), будет поддерживать классы stl (-stl - вообще-то библиотека имеет аналогичные собственные классы: например, вместо vector можно использовать QList, но пусть будет).


Для пользователей Windows лучше всего пойти привычным путём: запустить графический инсталлятор. Примите лицензионное соглашение и нажмите Next. Оставьте без изменения устанавливаемые компоненты; папку для установки библиотеки лучше тоже оставить по умолчанию, равно как и раздел меню "Пуск" ("Start"). Далее появится следующее окно:


Изображение 484970 - savepic.ru


Не снимайте галку в флажковом переключателе "Download and install minimal MinGW installation", чтобы скачать подходящую для Qt версию MinGW. Убедитесь в наличии работающего интернет-соединения и жмите Next. Согласитесь с лицензионным соглашением MinGW, дождитесь загрузки списка зеркал (на самом деле зеркал нет и инсталлятор MinGW будет загружен с сайта Trolltech / QtSoftware):


Изображение 476778 - savepic.ru


После загрузки MinGW начнётся собственно установка Qt, после чего сразу же - компиляция примеров и демонстрационных приложений (если Вы не отключили эту опцию). Вы можете в любой момент прервать компиляцию: на работоспособности библиотеки это не отразится, а любой из примеров в последующем можно будет откомпилировать индивидуально.


Установка других необходимых компонентов


Установка gdb и ctags в Windows заключается в распаковке содержимого архивов в соответствующие папки в корне жёсткого диска (например, C:gdb и C:ctags554.


Установка и настройка QDevelop


Установка QDevelop в таких дистрибутивах как Fedora и Ubuntu была описана выше. Для других дистрибутивов достаточно распаковать архив с бинарными файлами в ту папку домашнего каталога, где Вы планируете работать.


Пользователям Windows необходимо запустить графический инсталлятор, который и проделает всю работу по установке.


При первом запуске QDevelop появится окно настройки приложения:


Изображение 473706 - savepic.ru


В последующем его всегда можно вызвать, выбрав в меню: Инструменты - Инструменты...


В этом окне нужно указать пути к следующим файлам: сборщику Qt (qmake), сборщику MinGW (mingw32-make), отладчику (gdb), программе автодоплнения кода (ctags), программам работы с файлами перевода Qt (linguist, lupdate, lrelease), визуальному проектировщику графического интерфейса Qt (designer) и справочной системе Qt (assistant). Пути к файлам можно вводить либо вручную, либо с помощью диалога выбора (вызывается нажатием кнопки с тремя точками рядом с соответствующим полем ввода. Как видно из рисунка, слеши в пути можно вводить как в стиле Windows, так и Linux.


Проверить правильность введённых путей можно, нажав кнопку Тест (в случае, если путь введён правильно, рядом с полем появляется зелёная галочка). Когда все галочки станут зелёными, среда готова к работе. Дополнительную настройку QDevelop можно выполнить выбрав в меню Инструменты - Опции... Появится диалог "Настройки". На вкладке "Главное" можно указать папку для размещения проектов QDevelop по умолчанию: в ней среда будет создавать папки для хранения файлов с названием, совпадающим с именем проекта. У меня эта папка носит название /home/ank/projects.


Изображение 505453 - savepic.ru


Перейдите на вкладку "Редактор". Поскольку символы табуляции в различных редакторах отображаются по-разному, стоит отметить флажок "Заменять отступы пробелами". В качестве кодировки файлов рекомендую выбрать UTF-8, уже давно являющуюся основной в Linux.


Изображение 483949 - savepic.ru


Рассмотрим принципы работы с QDevelop на примере быстрой разработки приложения (хотя QDevelop поддерживает и проекты, написанные в традиционном стиле, полностью от руки), состоящего из двух окон: главного (наследуется от класса QMainWindow) и диалога (наследуется от класса QDialog). Главное окно будет содержать кнопку (класс QPushButton), нажатие на которую будет вызывать появление диалога.


Создание нового проекта


Выберите в меню Проект - Новый проект... В появившемся диалоговом окне "Создание нового проекта" в поле "Имя проекта" введите QtForms, в рамке "Наследование форм" в оба поля "Форма:" введите MainForm, а в оба поля "Класс" введите TMainForm. Отметьте переключатель "Отладочная версия". Нажмите OK, чтобы сгенерировать файлы проекта.


Изображение 507503 - savepic.ru


Работа с формами



В левой части окна QDevelop в окне "Состав проекта" имеются вкладки для работы с файлами и классами проекта. В настоящее время у нас имеется один класс - TMainForm, класс главного окна приложения. Хотя мы ещё не написали ни строчки кода, у нас уже есть работоспособное приложение. Убедимся в этом, выбрав в меню Сборка - Сборка (или нажав на F7). По завершении сборки запустим программу: Отладка - Старт (или нажмём F5).


Отредактируем главную форму. Перейдите на вкладку "Файлы" окна "Состав проекта", разверните список "Диалоги" и дважды щёлкните по строчке ui/MainForm.ui. Xml-файл окна откроется для визуального редактирования в Qt Designer. В сгенерированной форме уже имеются меню и панель состояния, которые нам не нужны. Щёлкните по меню правой кнопкой мыши и выберите в контекстном меню "Remove Menu Bar". Аналогичным образом поступим и с панелью состояния: "Remove Status Bar". В Property Editor отредактируем свойство windowTitle нашего окна, присвоив ему значение "Главное окно".


В палитре виджетов Qt Designer (список "Buttons") выберем виджет Push Button и перетащим его на форму. В Property Editor отредактируем свойства кнопки: objectName присвоим значение ShowButton, а text - Показать. Сохраним изменения и закроем Qt Designer.


Создадим форму диалога. Выберите в меню Проект - Добавить новый... В диалоговом окне "Добавить новый файл" отметьте переключатель "Диалог". В поле "Имя файла" введите DialogForm.ui. Нажмите OK и в следующем окне укажите класс, от которого будет унаследован диалог - QDialog.


Изображение 484975 - savepic.ru


Обратите внимание, что в списке "Диалоги" появилась новая строчка. Аналогично вышеописанному, откроем диалог для редактирования в Qt Designer. Удалите виджет с надписью и buttonBox, щёлкнув по ним мышью и нажав Delete.


Присвойте свойству objectName значение DialogForm, а windowTitle - Диалог. Поместите на форму кнопку, присвойте её свойству objectName YesButton, а свойству text - значение Да. Сохраните изменения.


Работа с сигналами и слотами на этапе визуального проектирования


В процессе работы различные компоненты (виджеты) приложения генерируют в ответ на происходящие события так называемые сигналы (signals), в ответ на которые программа совершает какие-либо действия, запрограммированные в специальных функциях, обработчиках событий - слотах. Для того, чтобы сигнал вызывал работу слота, между ними нужно установить соединение (connection).


Для этого мы будем работать с окном Signal/Slot Editor. Если оно скрыто, вызовите его, выбрав в меню Tools - Signal/Slot Editor.


Изображение 488047 - savepic.ru


Нажмите на голубой плюсик, чтобы добавить новое соединение. Виджетом, посылающим сигнал, у нас будет YesButton. Дважды щёлкните в поле Sender, чтобы выбрать её в выпадающем списке. Аналогично в других полях выберите: в качестве сигнала кнопки - щелчок по ней (поле Signal - clicked()), в качестве виджета - приёмника сигнала выберите саму форму (поле Receiver - DialogForm), в качестве обработчика события - стандартный сигнал закрытия окна (поле Slot - close()). Сохраните изменения и закройте Qt Designer. Теперь на этапе выполнения при щелчке по кнопке окно диалога будет закрываться.


Создание класса диалога


Для включения xml-формы в C++ проект, необходимо сгенерировать класс, который будет с этой формой работать. Выделите в списке "Диалоги" строчку ui/DialogForm.ui, щёлкните по ней правой кнопкой мыши и выберите в контекстном меню "Объекты диалога...". В появившемся диалоговом окне нажмите кнопку "Новый..." В появившемся диалоговом окне "Новая реализация" в поля "Имя класса" и "Имя файла" введите TDialogForm. Нажмите последовательно кнопки OK и Создать для генерации файлов класса.


Изображение 489071 - savepic.ru


Работа с сигналами и слотами в классе формы


Теперь мы можем можем работать с формой диалога как с обычным C++ объектом. Название класса формы и его члены отображаются на вкладке "Классы" окна "Состав проекта". В заголовочном файле класса главной формы (TMainForm) объявим в качестве закрытого члена класса объект TDialogForm* pDialog; а в раздел private slots: добавим новый слот void ShowDialogSlot();


В файле реализации класса главной формы поместим проведём иницализацию диалога в конструкторе (pDialog = new TDialogForm(this)) и поместим реализацию слота:



void TMainForm::ShowDialogSlot()

{

pDialog->show();

}


Кроме того, в конструкторах классов главной формы и диалога изменим значения флагов на Qt::Window и Qt::Dialog, соответственно. Теперь мы можем установить соединение между сигналом нажатия на кнопку ShowButton главной формы и созданным нами слотом. Сделаем это в конструкторе TMainForm: connect(ShowButton, SIGNAL(clicked()), this, SLOT(ShowDialogSlot()));


В целом после всех переделок код приложения должен выглядеть так:



// Файл TDialogForm.h

#ifndef TDIALOGFORM_H

#define TDIALOGFORM_H

//----------------------------------------------------------

#include

#include "ui_DialogForm.h"

//----------------------------------------------------------

class TDialogForm : public QDialog, public Ui::DialogForm

{
Q_OBJECT

public:


TDialogForm(QWidget * parent = 0, Qt::WFlags f = Qt::Dialog);

private slots:

};

//----------------------------------------------------------

#endif



// Файл TDialogForm.cpp

#include "TDialogForm.h"

//----------------------------------------------------------

TDialogForm::TDialogForm(QWidget * parent, Qt::WFlags f)

: QDialog(parent, f)

{

setupUi(this);

}

//----------------------------------------------------------



// Файл TMainForm.h

#ifndef TMAINFORM_H

#define TMAINFORM_H

//----------------------------------------------------------

#include

#include "ui_MainForm.h"

//----------------------------------------------------------

class TDialogForm;

//----------------------------------------------------------

class TMainForm : public QMainWindow, public Ui::MainForm

{

Q_OBJECT

public:

TMainForm(QWidget* parent = 0, Qt::WFlags f =
Qt::Window);



private:

TDialogForm* pDialog;



private slots:

void ShowDialogSlot();

};

//----------------------------------------------------------

#endif



// Файл TMainForm.cpp

#include "TMainForm.h"

#include "TDialogForm.h"

//----------------------------------------------------------

TMainForm::TMainForm(QWidget* parent, Qt::WFlags f)

: QMainWindow(parent, f)

{

setupUi(this);

pDialog = new TDialogForm(this);

connect(ShowButton, SIGNAL(clicked()), this,
SLOT(ShowDialogSlot()));

}

//----------------------------------------------------------

void TMainForm::ShowDialogSlot()

{

pDialog->show();

}

//----------------------------------------------------------


Откомпилируйте программу и запустите её на выполнение (F7 - F5). Убедитесь, что при нажатии на кнопку происходит показ диалогового окна.


Изображение 475759 - savepic.ru


Теперь Вы имеете мощный инструмент разработки кроссплатформенных приложений для Unix / Linux, Windows и Mac. Удачной работы!


Администратор: Dr_Andrew


Вопрос № 162772: Здравствуйте,подскажите пожалуйста! Требуется на языке C++ создать класс типа игра в крестики-нолики. Поле класса - массив из (3х3). Ставить можно только на свободные. Как это сделать?! Заранее благодарю....
Вопрос № 162785: Здравствуйте. У меня вопрос по QT. Возможно вопрос который я задам покажется слишком глупым, но я облазил множество страниц в интернете но не нашёл достаточно развернутого ответа на вопрос, вероятно из за незнания языка С. <b>Проблема т...

Вопрос № 162.772
Здравствуйте,подскажите пожалуйста!
Требуется на языке C++ создать класс типа игра в крестики-нолики. Поле класса - массив из (3х3). Ставить можно только на свободные.
Как это сделать?!
Заранее благодарю.
Отправлен: 19.03.2009, 19:49
Вопрос задал: Avtosport11 (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Denisss

Здравствуйте, Avtosport11!

Пример такого класса находится в приложении.
Метод set() предназначен для установки крестика (Х) или нолика (О) в ячейку с координатами (х, у).
setX() и setO() - для установки крестика и нолика соответственно в ячейку с указанными координатами.
get() возвращает содержимое указанной ячейки.
clear() - очистка поля, перезапуск игры.
count() - возвращает количество занятых клеток.
getWinner() - возвращает победителя.

Метод set() возвращает false, если:
- ячейка уже занята крестиком или ноликом.
- координаты выходят за пределы поля.
- игрок делает несколько ходов подряд - в этом случае второй и последующий ходы не применяются, ожидается ход другого игрока.
- уже имеется победитель (в этом случае игра считается законченной, и ничьих ходов более не ожидается).
- производится попытка установить в ячейку элемент XO::None (т.е. попытка опустошить клетку).

Пример выполнен в виде одного фай ла только ради простоты.

Успехов!

Приложение:

---------
Все должно быть сделано настолько просто, насколько это возможно. Но не проще. (с) А.Эйнштейн

Ответ отправил: Denisss (статус: Профессор)
Россия, Москва
ICQ: 2412904
----
Ответ отправлен: 21.03.2009, 13:57

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 245702 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Вопрос № 162.785
    Здравствуйте.

    У меня вопрос по QT. Возможно вопрос который я задам покажется слишком глупым, но я облазил множество страниц в интернете но не нашёл достаточно развернутого ответа на вопрос, вероятно из за незнания языка С.

    Проблема такая. Мне не удаётся разобраться как работают сигналы и слоты. Примеры вроде этих http://www.linuxcenter.ru/lib/books/qt3/qt3_5.phtml#HELLOQT не катят, т.к. там всё происходит в одном файле. У меня проект созданный в QTCreator (Qt SDK 2009.01) состоит из нескольких файлов.

    Задача: при запуске программы появляется окно (mainwindow.ui) с единственной кнопкой (PushButton). При нажатии на кнопку появляется другое уже готовое окно (form.ui)

    Заранее благодарю.

    Приложение:

    Отправлен: 19.03.2009, 21:18
    Вопрос задал: Shaman_888 (статус: Посетитель)
    Всего ответов: 2
    Мини-форум вопроса >>> (сообщений: 17)

    Отвечает: Micren
    Здравствуйте, Shaman_888!
    А вот так не подойдет?
    Код:

    //ui_form.h
    /********************************************************************************
    ** Form generated from reading ui file 'form.ui'
    **
    ** Created: Sat 21. Mar 16:37:22 2009
    ** by: Qt User Interface Compiler version 4.5.0
    **
    ** WARNING! All changes made in this file will be lost when recompiling ui file!
    ********************************************************************************/

    #ifndef UI_FORM_H
    #define UI_FORM_H

    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplication>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QHeaderView>
    #include <QtGui/QWidget>< br>
    QT_BEGIN_NAMESPACE

    class Ui_FormClass
    {
    public:

    void setupUi(QWidget *FormClass)
    {
    if (FormClass->objectName().isEmpty())
    FormClass->setObjectName(QString::fromUtf8("FormClass"));
    FormClass->setWindowModality(Qt::WindowModal);
    FormClass->resize(400, 300);

    retranslateUi(FormClass);

    QMetaObject::connectSlotsByName(FormClass);
    } // setupUi

    void retranslateUi(QWidget *FormClass)
    {
    FormClass->setWindowTitle(QApplication::translate("FormClass", "Form", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(FormClass);
    } // retranslateUi

    };

    namespace Ui {
    class FormClass: public Ui_FormClass {};
    } // namespace Ui

    QT_END_NAMESPACE

    #endif // UI_FORM_H

    //form.h
    #ifndef FORM_H
    #define FORM_H

    #include <QDialog>
    #include &qu ot;ui_form.h"

    class Form : public QDialog
    {
    Q_OBJECT

    public:
    Form(QWidget *parent = 0);
    ~Form();

    private:
    Ui::FormClass ui;
    };

    #endif // FORM_H

    //form.cpp
    #include "form.h"

    Form::Form(QWidget *parent)
    : QDialog(parent)
    {
    ui.setupUi(this);
    }

    Form::~Form()
    {

    }

    //ui_mainwindow.h
    /********************************************************************************
    ** Form generated from reading ui file 'mainwindow.ui'
    **
    ** Created: Sat 21. Mar 18:42:13 2009
    ** by: Qt User Interface Compiler version 4.5.0
    **
    ** WARNING! All changes made in this file will be lost when recompiling ui file!
    ********************************************************************************/

    #ifndef UI_MAINWINDOW_H
    #define UI_MAINWINDOW_H

    #include <QtCore/QVariant>
    #include <QtGui/QAction>
    #include <QtGui/QApplicati on>
    #include <QtGui/QButtonGroup>
    #include <QtGui/QHeaderView>
    #include <QtGui/QPushButton>
    #include <QtGui/QWidget>

    QT_BEGIN_NAMESPACE

    class Ui_MainWindowClass
    {
    public:
    QPushButton *pushButton;

    void setupUi(QWidget *MainWindowClass)
    {
    if (MainWindowClass->objectName().isEmpty())
    MainWindowClass->setObjectName(QString::fromUtf8("MainWindowClass"));
    MainWindowClass->resize(400, 97);
    pushButton = new QPushButton(MainWindowClass);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(150, 40, 75, 23));

    retranslateUi(MainWindowClass);

    QMetaObject::connectSlotsByName(MainWindowClass);
    } // setupUi

    void retranslateUi(QWidget *MainWindowClass)
    {
    MainWindowClass->setWindowTitle(QApplication::t ranslate("MainWindowClass", "MainWindow", 0, QApplication::UnicodeUTF8));
    pushButton->setText(QApplication::translate("MainWindowClass", "PushButton", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(MainWindowClass);
    } // retranslateUi

    };

    namespace Ui {
    class MainWindowClass: public Ui_MainWindowClass {};
    } // namespace Ui

    QT_END_NAMESPACE

    #endif // UI_MAINWINDOW_H

    //mainwindow.h
    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H

    #include <QWidget>
    #include "ui_mainwindow.h"
    #include "form.h"

    class MainWindow : public QWidget
    {
    Q_OBJECT

    public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();

    private:
    Ui::MainWindowClass ui;
    Form* form;

    private slots:
    void on_pushButton_clicked();
    };

    #endif // MAINWINDOW_H

    //mainwindow.cpp
    #include "mainwindow.h"

    MainWindow::MainWindow(QWidget *parent)
    : QWidget(parent)
    , form(0)
    {
    ui.setupUi(this);
    }

    MainWindow::~MainWindow()
    {

    }

    void MainWindow::on_pushButton_clicked()
    {
    if(!form)form=new Form(this);
    form->show();
    }

    //main.cpp
    #include <QtGui/QApplication>
    #include "mainwindow.h"

    int main(int argc, char *argv[])
    {
    QApplication a(argc, argv);
    MainWindow window;
    window.show();
    return a.exec();
    }

    Автором ответа внесены изменения после обсуждения с Dr_Andrew, ответ отредактирован, убрана неработающая строка..

    К сожалению, Вы приводите код, который нельзя признать удачным:
    Во-первых, непонятно, для чего наследовать класс MainWindow от QWidget? Логичнее было бы от QMainWindow.
    Во-вторых, совершенно нет необходимости объявлять окно главной формы приложения в виде указателя: достаточно обычной переменной (см. мой ответ).
    Dr_Andrew, Специалист

    Единственное, что оставил так это наследование от QWidget. Но это к вопросу не относится, а QWidget является базовым классом для всех GUIшных классов.
    Micren, Студент



    --------
    ∙ Отредактировал: Shapoklak, Академик
    ∙ Дата редактирования: 21.03.2009, 22:13 (время московское)
    Ответ отправил: Micren (статус: Студент)
    Ответ отправлен: 19.03.2009, 22:27

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 245650 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5


    Отвечает: Dr_Andrew
    Здравствуйте, Shaman_888!
    1) Начнём с того, что Ваш выбор IDE для разработки программ с использованием Qt 4.x нельзя признать удачным: несмотря на большое количество полезных функций, Qt Creator генерирует не слишком хороший код, к тому же, плохо понятный новичку. Гораздо более внятный код генерирует среда разработки QDevelop. Из дополнительных плюсов: русифицированный (в отличие от Qt Creator) интерфейс, более удобные средства работы с проектами, как включающими ui-формы, так и написанными на "чистом" C++ (Qt Creator ориентирован только на первый тип проектов), более удобный интерфейс.
    2) К сожалению, примеры для работы с сигналами и слотами, написанные для Qt 3.x мало подходят для Qt 4.x: если в 3-й версии библиотеки из ui-формы (которая представляет собой xml-файл) генерировался C++-код (класс формы), то в 4-й - ui-форма непосредственно включается в проект и создаётся уже два класса: собственно класс формы и класс для управления ui-формой, которому наследует 1-й класс. При этом в конструкторе 1-го класса для доступа к объектам ui-формы обязательно должен быть вызван метод второго - setupUi.
    3) Как и любое приложение с графическим интерфейсом пользователя, программа на Qt отслеживает различные события (например, событие нажатия на кнопку) в главном цикле (в Вашем коде это a.exec();). Если событие произошло (например, пользователь нажал на кнопку), то виджет - источник события (например, кнопка) генерирует сигнал. Если имеется соответствующий сигналу обработчик события (в системе Linux-программирования он называется слотом), то виджет-приёмник (обычно это сама форма) выполняет какие-то действия, реализованные в слоте. Между сигналом и слотом нужно установить соединение вызовом функции connection(Widget-sender, SIGNAL(signal()), Widget-receiver, SLOT(slot())); Т.е. в качестве аргументов функции connect обязательно должны выступать 2 объекта (виджет - источник сигнала и виджет-п риёмник) и две функции: сигнал и слот. Строго говоря, слот является особой функцией, для правильной работы которого утилита moc генерирует дополнительный код. Для вызова утилиты в начале класса виджета - обработчика события до объявления слота должен вызываться макрос Q_OBJECT. При создании собственных слотов имеет смысл как-то помечать их для отличия от обычных функций (например, в названии добавлять Slot: void ShowDialogSlot()).
    4) Ошибки Вашего кода:
    а) Не стоит в качестве класса диалогового окна использовать класс, унаследованный от QWidget; лучше использовать класс, унаследованный от QDialog хотя бы ради возможности делать диалог модальным и немодальным.
    б) В главной функции программы должен быть единственный виджет - главный. В Вашем примере это виджет главного окна. Диалог лучше сделать членом класса главной формы.
    в) В конструкторе класса главной формы следует инициализировать объект класса диалога, после чего установить соединение между щелчком по кнопке и отображением окна диалога (реально объект-диалог будет создан при запуске приложения, но невидим; слот show() просто делает его видимым, в то время как слот hide() - скрывает его).
    Как уже упоминалось выше, создание приложения в Qt 4.x возможно двумя способами: 1) в Linux-стиле (на чистом C++ с помощью исключительно текстового редактора) с последующим созданием проекта и компиляцией средствами самой библиотеки и 2) с использованием средств быстрой разработки приложений с включением в проект xml-форм, созданных в Qt Designer или Qt Creator. IDE QDevelop содержит средства для удобной работы с первым и вторым типами проектов. Но в любом случае алгоритм работы такой: создаём класс главной формы, создаём класс диалога, включаем объект класса диалога в качестве члена класса главной формы, создаём слот показа диалога в классе главной формы, устанавливаем соединение. Второй тип проект требует создания дополнительных классов для подключения ui-форм. Поэтому в приложении я приво жу более простой вариант написанного с нуля приложения без ui-форм. На его основе Вы можете легко откорректировать Вашу программу.

    Приложение:

    Ответ отправил: Dr_Andrew (статус: Специалист)
    Ответ отправлен: 21.03.2009, 00:44

    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 245681 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!

    Оценка за ответ: 5


    Вы имеете возможность оценить этот выпуск рассылки.
    Нам очень важно Ваше мнение!
    Оценить этот выпуск рассылки >>

    Отправить сообщение в эту рассылку:


    Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
    Чтобы отправить сообщение в рассылку, откройте это письмо в браузере.

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RusFAQ.ru, Россия, Москва.
    Авторское право: ООО "Мастер-Эксперт Про"
    Техподдержка портала, тел.: +7 (926) 535-23-31
    Хостинг: "Московский хостер"
    Поддержка: "Московский дизайнер"
    Авторские права | Реклама на портале

    ∙ Версия системы: 5.13 от 01.12.2008

    Яндекс Rambler's Top100
    RusFAQ.ru | MosHoster.ru | MosDesigner.ru
    RusIRC.ru | Kalashnikoff.ru | RadioLeader.ru

    В избранное