Archive:Development/Tutorials/First program (zh CN)

From KDE TechBase

Template:I18n/Language Navigation Bar (zh CN) Template:TutorialBrowser (zh CN)

摘要

你的第一个程序将会用一句"Hello World"来向这个世界问好。为了实现它,我们将使用KMessageBox,并定制其中的一个按钮。

Template:Tip (zh CN)

Template:Tip (zh CN)

代码

我们需要的全部代码都在一个文件main.cpp中。使用下列代码创建该文件:

#include <QString>
#include <KApplication>
#include <KAboutData>
#include <KMessageBox>
#include <KCmdLineArgs>
#include <KLocalizedString>

int main (int argc, char *argv[])
{
    KAboutData aboutData("tutorial1",                  // 内部使用的程序名
                         0,                            // 消息编目名。如果为null,则使用程序名
                         ki18n("Tutorial 1"),          // 显示用的程序名称字符串
                         "1.0",                        // 程序版本号字符串
                         ki18n("KMessageBox popup"),   // 对程序实现功能的简要描述
                         KAboutData::License_GPL,      // 授权标识符
                         ki18n("(c) 2007"),            // 版权声明
                         ki18n("Some text..."),        // 任意格式的文本,可以包含任意类型的信息
                         "http://tutorial.com",        // 程序主页字符串
                         "[email protected]");       // 报告bug用的邮件地址字符串

    KCmdLineArgs::init( argc, argv, &aboutData );
    KApplication app;
    KGuiItem guiItem( QString( "Hello" ), QString(),
                      QString( "this is a tooltip" ),
                      QString( "this is a whatsthis" ) );
    KMessageBox::questionYesNo( 0, "Hello World", "Hello", guiItem );
}

我们在此程序中遇到的第一个KDE类是KAboutData。这个类被用来保存关于程序的各种信息,如功能的简单描述、作者和版权信息等。几乎所有的KDE应用程序都会使用该类。

然后我们遇到了KCmdLineArgs。这个类可以用来处理命令行开关。例如,可以让某个开关指定使用一个特定的文件来打开程序。在本例中,我们只使用之前创建的KAboutData对象来初始化它,这使我们在运行程序时可以使用--version--author开关。

接下来我们创建了一个KApplication对象。这在每个程序中都必须做一次,因为KDE中的很多功能都依赖于该对象,如i18n等。

现在我们已经完成了全部必须的KDE设置工作,接下来就可以让我们的程序做一些有趣的事情了。我们将要创建一个弹出框,并将定制其中的一个按钮。要实现该定制,我们需要一个KGuiItem对象。KGuiItem构造函数的第一个参数是要显示在该item(在本例中,是一个按钮)中的文字。接下来的参数让我们可以为该按钮设定一个图标,但这里我们并不需要图标,因此只需要将QString()传递给它就行。最后,我们设定tooltip(当鼠标在一个item上徘徊时显示的文字)和“这是什么?”(用鼠标右击item或按下Shift+F1时显示)文本。

现在有了需要的item,我们就可以创建弹出框了。在这里我们调用KMessageBox::questionYesNo()函数,它在缺省参数的条件下会创建一个有"Yes"和"No"按钮的消息框。函数的第二个参数是将要显示栽弹出框中间的文字。第三个参数是窗口的标题。最后,我们使用我们创建的KGuiItem对象来设定(通常情况下将会是)"Yes"按钮的KGuiItem。

现在,代码相关的工作我们已经全部完成了。接下来我们要构建并尝试运行它。

构建

如果你已经按照从源代码构建KDE4中的说明设置好了你的环境,你就可以用下面的命令编译代码:

g++ main.cpp -o tutorial1 \
-I$QTDIR/include/Qt \
-I$QTDIR/include/QtCore \
-I$QTDIR/include \
-I$KDEDIR/include/KDE \
-I$KDEDIR/include \
-L$KDEDIR/lib \
-L$QTDIR/lib -lQtCore -lQtGui -lkdeui -lkdecore

然后,使用下面的命令运行它:

dbus-launch ./tutorial1

使用CMake

如果它能够正常运行,你也许会进一步希望使用CMake来构建来,就像其它的KDE程序一样。CMake会自动找出KDE、Qt等的头文件和库,并让你能够轻松在其它机器上编译你的程序。

CMakeLists.txt

在main.cpp所在的目录中创建一个名为CMakeLists.txt的文件,其内容如下:

project (tutorial1)

find_package(KDE4 REQUIRED)
include_directories( ${KDE4_INCLUDES} )

set(tutorial1_SRCS main.cpp)

kde4_add_executable(tutorial1 ${tutorial1_SRCS})
target_link_libraries(tutorial1 ${KDE4_KDEUI_LIBS})

在这段代码中,find_package()函数找出你让它找的软件包(在这里是KDE4),并且自动设置一些描述包的库文件和头文件所在路径的变量。在这里,我们将使用KDE4_INCLUDES变量,它包含了KDE4头文件所在的路径。

为了让编译器能找到这些头文件,我们将该变量传递给include_directories()函数,它会将KDE4头文件列入编译时查找头文件的搜索路径中。

接下来我们使用set() 函数创建了一个叫tutorial1_SRCS的变量。在这里,我们只是简单的将它设成我们唯一源代码文件的文件名。

然后我们使用kde4_add_executable()函数,将tutorial1_SRCS变量中列出的源文件创建为一个叫tutorial1的可执行文件。

最终我们使用target_link_libraries()函数,以及之前find_package()设定的变量KDE4_KDEUI_LIBS,将我们的可执行程序链接到KDE4的kdeui库。

Make与运行

如果你已经按照构建KDE4中的说明设置好了环境,你就可以使用下面的命令来编译你的程序:

cmakekde

否则,你也可以这样编译:

mkdir build && cd build
cmake .. # 注意,这两个点代表父目录。
make

然后使用下面的命令来运行它:

./tutorial1.shell

继续前进

接下来你可以开始学习下一课:创建主窗口.