選單和工具列

  • KAction widget
    1. KAction 的建構函式:
      #include <kde/kaction.h>
      KAction (const QString &text, const KShortcut &cut,
                const QObject *receiver,
                const char *slot, QObject *parent, const char *name = 0)
      # 必須輸入文字、快速鍵、圖示和一個 slot,slot 為 KAction 被選定時被呼叫。
      
    2. 實例:產生一個 New 選單和工具列,當它們被按下時就會呼叫 newFile()。
      KAction *new_file = new KAction("New", "filenew",
                                          KstdAccel::key(KstdAccel::New),
                                          this, SLOT(newFile()), this,
                                          "newaction");
      
    3. 為 KAction new_file 加入選單、工具列:
      new_file->plug(a_menu);
      new_file->plug(a_toolbar);
      
    4. 取消 KAction new_file
      new_file->setEnabled(FALSE);
      
    5. KDE 提供一些標準 KAction 物件
      #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 ...
      etc...
      
    6. KActionCollection 物件用來管理一個視窗中的 KAction,利用 KMainWindow 的 actionCollection()成員函式來取得目前的物件。
      KAction *saveas = KStdAction::saveAs(this, SLOT(saveAs()),
                                    actionCollection(),"saveas");
      

  • 實例:含有選單和工具列的 KDE 應用程式
    1. 標頭檔案 KDEMenu.h
      #include <kmainwindow.h>
      class KDEMenu : public KMainWindow
      {
        Q_OBJECT
        public:
          KDEMenu(const char * name = 0);
        private slots:
          void newFile();
          void aboutApp();
      };
      
    2. 在 KDEMenu.cpp 中引入 widget 相關的檔案:
      #include "KDEMenu.h"
      #include  <kapp.h>
      #include  <kaction.h>
      #include  <kstdaccel.h>
      #include  <kmenubar.h>
      #include  <kaboutdialog.h>
      
    3. 在建構函式中產生三個 KAction widget。
      KDEMenu::KDEMenu(const char *name = 0) : KMainWindow (0L, name )
      {
        KAction *new_file = new KAction("New", "filenew",
                                KstdAccel::key(KstdAccel::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);
        menuBar()->insertItem("&Help", help_menu);
      
    5. 將 action 都插入選單和工具列中,並在 new_filequit_action 之間插入一個分隔行:
        new_file->plug(file_menu);
        file_menu->insertSeparator();
        quit_action->plug(file_menu);
        help_action->plug(help_menu);
        new_file->plug(toolBar());
        quit_action->plug(toolBar());
      }
      
    6. slot 的定義:aboutApp 產生一個 KAbout 對話窗,顯示程式的相關資訊。
      void KDEMenu::newFile()
      {
        // Create new File
      }
      void KDEMenu::aboutApp()
      {
         KAboutDialog *about = new KAboutDialog(this, "dialog");
         about->setAuthor(QString("A. N. Author"), QString("an@email.net"),
                          QString("http://url.com"), QString("work"));
         about->setVersion("1.0");
         about->show();
      }
      
      int main(int argc, char **argv)
      {
        KApplication app( argc, argv, "cdapp" );;
        KDEMenu *window = new KDEMenu("kdemenu");
        app.setMainWidget(window);
        window->show();
        return app.exec();
      }
      
    7. 提供一個 menu.pro 檔案給予 qmake:
      TARGET = kdemenu
      MOC_DIR = moc
      OBJECTS_DIR = obj
      INCLUDEPATH = /usr/include/kde
      QMAKE_LIBDIR_X11 += -L$KDEDIR/lib
      QMAKE_LIBS_X11 += -lkdeui -lkdecore
      SOURCES = KDEMenu.cpp
      HEADERS = KDEMenu.h
      
    8. 執行 qmake 來產生 Makefile,隨後再進行編譯、執行程式。
      $ qmake menu.prop -o Makefile
      $ make
      $ ./kdemenu
      
      Image kdemenu Image kdemenu1