Indrekis
Indrekis

Categories

  • retrocomputing
  • ibm_pc_compat

Tags

  • retrocomputing
  • IBM PC та сумісні
  • Linux
  • KDE

Другий ретро-підручник про KDE, з перекладених зимою 2001 року. Перший тут.

Оригінальний архів тут.

KHello

Це KDE версія найвідомішої програми – Hello World!. Якщо ви ніколи не писали програм для KDE, вона для вас.

KHello 1 - Найпростіша можлива KDE програма

 

Опис

Це, наскільки я знаю – найпростіша можлива KDE-програма.

Текст

Вихідний текст програми дуже простий:

/************* khello.cc *******************/
#include <kapp.h>
#include <ktmainwindow.h>

int main( int argc, char **argv )
{
  KApplication a( argc, argv, "khello" );
  KTMainWindow *w = new KTMainWindow();
  w->setGeometry(100,100,200,100);

  a.setMainWidget( w );
  w->show();
  return a.exec();
}
/************* end of file *****************/

Пояснення до коду

Тут пояснено окремі команди:

#include <kapp.h>
#include <ktmainwindow.h>

Файл kapp.h містить деякі базові елементи, необхідні всім програмам, а в файлі ktmainwindow.hc++``c++ оголошено клас що використовується для всіх головних вікон KDE - програми:

KApplication a(argc, argv);
KTMainWindow *w = new KTMainWindow();

Створює об’єкти KApplication і KTMainWindow. KApplication буде містити весь код необхідний нашій програмі а KTMainWindow буде нашим головним вікном:

w->setGeometry(100,100,200,100);

Перемістити і змінити розмір вікна. Воно переміщається в положення з координатами (100, 100), а його розмір стає 200x100 (висота x ширина):

a.setMainWidget( w );

Програма має знати де шукати головне вікно.

w->show();
``

Робимо головне вікно видимим.

```c++
return a.exec();

Запускаємо програму.

Компіляція

 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti khello.cc
 g++ -L$KDEDIR/lib -lkdeui -lkdecore -lqt -ldl -o khello khello.o

KHello 2 - Створення класу вікна (window class)

 

Опис

На цьому кроці я поясню як створити віконний клас.

Текст

На цей раз маємо три файли:

 /************* khello.h *******************/ 
#include <kapp.h> 
#include <ktmainwindow.h> 

class KHello : public KTMainWindow
{
Q_OBJECT
  public: void closeEvent(QCloseEvent
*);
}; 
/************* khello.cc ******************/ 
#include "khello.moc" 
void KHello::closeEvent(QCloseEvent *)  
{
  kapp->quit();
} 
/************* main.cc ********************/
#include "khello.h"

int main( int argc, char **argv )
{
  KApplication a( argc, argv, "khello" );
  KHello *w =  
  newKHello();

  w->setGeometry(100,100,200,100); a.setMainWidget( w
  );w->show();
  return a.exec();
}

Пояснення до коду

Тут лише декілька команд потребують пояснення.

Q_OBJECT

Це команда для мета-компілятора об’єктів (meta object compiler – MOC), котрий входить до складу файлів розробника для QT.

void closeEvent(QCloseEvent *);

Ця функція викликається при завершенні вашої KDE програми.

#include "khello.moc"

Мета-компілятор об’єктів створює moc-файл, який ви маєте включити у свій проект. moc-файл це розширена версія вашого файлу заголовків.

Компіляція

 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti main.cc
 moc khello.h -o khello.moc
 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti khello.cc
 g++ -L$KDEDIR/lib -lkdeui -lkdecore -lqt -ldl -o khello main.o khello.o

KHello 3 – Додаємо кнопки

 

Опис

А зараз якраз час додати декілька кнопок.

Текст

Старий код – сірий. Я не наводжу тут main.cc, тому що тут він такий ж, як і в KHello #2.

/************* khello.h *******************/
#include <kapp.h>
#include <ktmainwindow.h>
#include <qpushbutton.h>

class KHello : public KTMainWindow
{
  Q_OBJECT
public:
  KHello();
  void closeEvent(QCloseEvent *);
public slots:
  void slotHello();
  void slotExit();
private:
  QPushButton *btnHello;
  QPushButton *btnExit;
};
/************* khello.cc ******************/
#include "khello.moc"
#include <kmsgbox.h>

KHello::KHello() : KTMainWindow()
{
  btnHello =   new QPushButton("Hello",this);
  btnHello->setGeometry(45,30,50,25); btnHello->show();
  connect(btnHello, SIGNAL(clicked()), this, SLOT(slotHello())); 
  
  btnExit =   new QPushButton("Exit",this);
  btnExit->setGeometry(105,30,50,25); btnExit->show();
  connect(btnExit, SIGNAL(clicked()), this, SLOT(slotExit()));  
}

void KHello::closeEvent(QCloseEvent*)
{
  kapp->quit();
}

void KHello::slotHello()
{
  KMsgBox::message(0,"Important","Hello World!");
}

void KHello::slotExit()
{
  close();
}

Пояснення до коду

Я поясню лише те, що на мою думку, потрібно на даний час.

public slots:

Ця секція є новою, і вона використовується мета-компілятором об’єктів. У світі QT слоти(slots) є обробниками подій (event-handlers) a сигнали (signals) є подіями (events).Розміщуйте всі ваші обробники подій в цій секції.

connect(btnHello, SIGNAL(clicked()), this, SLOT(slotHello()));

Приєднує подію “cliked” від об’єкту btnHello до обробника “slotHello”.

Компіляція

 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti main.cc
 moc khello.h -o khello.moc
 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti khello.cc
 g++ -L$KDEDIR/lib -lkdeui -lkdecore -lqt -ldl -o khello main.o khello.o

KHello 4 – Додаємо Меню

 

Опис

Тепер ощасливимо наших користувачів, додавши меню!

Текст

/************* khello.h *******************/
#include <kapp.h>
#include <ktmainwindow.h>
#include <qpushbutton.h>
#include <kmenubar.h>
#include <qpopupmenu.h>

class KHello : public KTMainWindow
{
  Q_OBJECT
public:
  KHello();
  void closeEvent(QCloseEvent *);
public slots:
  void slotHello();
  void slotExit();
private:
  QPushButton *btnHello;
  QPushButton *btnExit;
  KMenuBar *menu;
  QPopupMenu *file, *help;
};
/************* khello.cc ******************/
#include "khello.moc"
#include <kmsgbox.h>

KHello::KHello() : KTMainWindow()
{
  btnHello =   new
  QPushButton("Hello",this);
  btnHello->setGeometry(45,30,50,25);btnHello->show();
  connect(btnHello, SIGNAL(clicked()), this, SLOT(slotHello())); 
  
  btnExit =   new
  QPushButton("Exit",this);
  btnExit->setGeometry(105,30,50,25);btnExit->show();
  connect(btnExit, SIGNAL(clicked()), this, SLOT(slotExit()));   
  
  file =  
  newQPopupMenu(); file->insertItem("&Hello", this,
  SLOT(slotHello()));file->insertItem("&Exit", this, SLOT(slotExit())); 
  
  help = kapp->getHelpMenu(TRUE, "KHello\nby Daniel Marjamдki"); 
  
  menu =  
  newKMenuBar(this); menu->insertItem("&File",
  file);menu->insertItem("&Help", help);
} 

void KHello::closeEvent(QCloseEvent*)
  {kapp->quit();
}

void KHello::slotHello()
{
  KMsgBox::message(0,"Important","Hello World!");
}

void KHello::slotExit()
{
  close();
}

Важливий код

Цей код простий і не потребує додаткових пояснень. Однак, я думаю один рядок важливий і я зупинюся на його функціях.

help = kapp->getHelpMenu(TRUE, "KHello\nby Daniel Marjamaki");

KApplication містить вбудовану функцію яка генерує меню допомоги. Використовуйте її щоб ваші програми були схожими на інші KDE програми.

Компіляція

 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti main.cc
 moc khello.h -o khello.moc
 g++ -c -I$KDEDIR/include -I$QTDIR -fno-rtti khello.cc
 g++ -L$KDEDIR/lib -lkdeui -lkdecore -lqt -ldl -o khello main.o khello.o