INCLUDEPATH = /usr/include/kde
QMAKE_LIBDIR_X11 += /usr/lib
QMAKE_LIBS_X11 += -lkdeui -lkdecore
SOURCES = main.cpp window.cpp
HEADERS = window.h
Вы задаете результирующий двоичный файл, временные каталоги moc и объектных файлов, путь к библиотеке KDE и исходные тексты, и заголовочные файлы, из которых формируется приложение. Учтите, что местонахождение файлов библиотек и заголовочных файлов KDE зависит от вашего дистрибутива. Пользователи SUSE должны приравнять INCLUDEPATH путь /opt/kde3/include и QMAKE_LIBS_X11 путь /opt/kde3/lib.
$ qmake file.pro -о Makefile
Затем вы можете выполнить команду make как обычно, что не вызовет затруднений. Для упрощения процедуры построения приложения следует использовать qmake с программами любой сложности, применяющими KDE/Qt.
Создание меню и панелей инструментов с помощью KDE
Для того чтобы продемонстрировать мощь виджетов KDE, мы оставили меню и панели инструментов напоследок, поскольку они — уж очень наглядные примеры того, как библиотеки KDE экономят время и усилия по сравнению с применением только Qt или любых других комплектов с элементами графического пользовательского интерфейса.
Обычно в библиотеках GUI элементы меню и панелей инструментов — отличающиеся элементы, каждый со своим собственным виджетом. Вы должны создавать отдельные объекты для каждого элемента и отслеживать изменения, например, делая недоступными определенные варианты, каждый отдельно.
У программистов KDE появилось лучшее решение. Вместо такого обособленного подхода в KDE определен виджет KAction для представления действия, которое может выполнить приложение. Это действие может открыть новый документ, сохранить файл или вывести окно справки.
KAction присваивается текст, клавиатурный акселератор, пиктограмма и слот, который вызывается при активизации действия:
KAction *new_file = new KAction("New", "filenew",
KstdAcceclass="underline" :shortcut(KstdAcceclass="underline" :New), this,
SLOT(newFile()), this, "newaction");
Затем KAction может быть вставлено в меню и панель инструментов без дополнительного описания:
new_file->plug(a_menu);
new_file->plug(a_toolbar);
Таким образом, вы создали пункт меню New и кнопку панели инструментов, которые вызывают newFile при щелчке кнопкой мыши.
Теперь если вам нужно отменить KAction — скажем, вы не хотите, чтобы пользователь мог создать новый файл, — вызов централизован:
new_file->setEnabled(FALSE);
Это все, что касается меню и панелей инструментов в среде KDE — на самом деле очень легко и просто. Далее приведен конструктор виджета KAction:
#include <kde/kaction.h>
KAction(const QString& text, const KShortcut& cut,
const QObject* receiver, const char* slot,
QObject *parent, const char* name = 0);
KDE предоставляет стандартные объекты KAction для унификации текста, клавиатурных акселераторов и пиктограмм в разных приложениях KDE:
#include <kde/kaction.h>
KAction* openNew(const QObject* recvr, const char *slot,
KActionCollection* parent, const char* name = 0)ж
KAction* save ...
KAction* saveAs ...
KAction* revert ...
KAction* close ...
KAction* print ...
И т.д.
Любое стандартное действие принимает одни и те же параметры; слот-приемник и функцию, KActionCollection и имя KAction. Объект KActionCollection управляет в окне объектами KAction, и вы можете получить текущий объект с помощью метода actionCollection окна KMainWindow:
KAction *saveas = KStdAction::saveAs(this, SLOT(saveAs()) ,
actionCollection(), "saveas");
Выполните упражнение 17.8.
В приведенном далее примере вы опробуете объекты KAction в приложении среды KDE.
1. Начните с заголовочного файла KDEMenu.h. KDEMenu — это подкласс KMainWindow, являющегося подклассом класса QMainWindow. KMainWindow управляет сеансом в среде KDE и обладает встроенными панелью инструментов и строкой состояния.
#include <kde/kmainwindow.h>
class KDEMenu : public KMainWindow {
Q_OBJECT
public:
KDEMenu(const char * name = 0);
private slots:
void newFile();
void aboutApp();
};
2. Файл KDEMenu.cpp начните с директив #include для виджетов, которые будете применять:
#include "KDEMenu.h"
#include <kde/kapp.h>
#include <kde/kaction.h>
#include <kde/kstdaccel.h>
#include <kde/kmenubar.h>
#include <kde/kaboutdialog.h>
3. В конструкторах, создающих три виджета KAction, new_file определяется вручную, a quit_action и help_action используют стандартные определения KAction:
KDEMenu::KDEMenu(const char *name = 0) : KMainWindow (0L, name) {
KAction *new_file = new KAction("New", "filenew",
KstdAcceclass="underline" :shortcut(KstdAcceclass="underline" :New), this, SLOT(newFile()),
this, "newaction");
KAction *quit_action = KStdAction::quit(KApplication::kApplication(),
SLOT(quit()), actionCollection());
KAction *help_action = KStdAction::aboutApp(this, SLOT(aboutApp()),
actionCollection());
4. Создайте два меню верхнего уровня и включите их в строку меню KApplication:
QPopupMenu *file_menu = new QPopupMenu;
QPopupMenu *help_menu = new QPopupMenu;
menuBar()->insertItem("&File", file_menu);