linux平台下的QT3快速开发入门 二

linux平台下的QT3快速开发入门(二)

二、编写代码

        1、主入口函数。

            用文本编辑器在工程目录下创建一个main.cpp文件, 代码如下:

            #include   application.h

            #include   "logindialog.h"

            int   main(int  argc,  char  **argv)

            {

                      QApplication   app(argc,  argv);

                      LoginDialog   *dialog  = new  LoginDialog;

                      app.setMainWidget(dialog);

                      dialog->show();

                      return  app.exec();

             }

           保存退出,输入以下命令编译程序:

            qmake   -project

            qmake

            make

           现在可以输入 ./qtlogin 运行这个程序(如图),只是按下“确定”按钮是没有反应的。因为checkPasswd()槽的功能还没有实现。

          2、实现我们所想要的功能。

          观察一下现在的工程目录会发现多了很多文件,Qt的用户界面编译器工具uic会对界面文件 *.ui 文件自动生成对应的 *.h 和 *.cpp文件。如:logindialog.ui会生成logindialog.h和logindialog.cpp这两个文件。我们一般不能在这两个文件里面加入我们的代码,因为如果一旦修改界面,里面的代码就全没了。我们的代码有两种实现方法:

         (1)把代码加到*.ui.h文件中,这样uic工具会自动合并我们的代码。

              用文本编辑器在工程目录下编辑文件logindialog.ui.h,代码如下:

            void   LoginDialog::init()

            {

                         //你可以把初始化的代码写到这里,uic工具会自动的在这个LoginDialog窗体的构造函数的最后调用这个init()函数。

            }

             void   LoginDialog::checkPasswd()

             {

                         if  (nameEdit->text() == "myname" 

                             &&  passwdEdit->text() == "mypasswd")

                         {

                                        MainForm * form = new   MainForm;

                                         form->show();

                                         this->hide();

                          }

              }

         (2)另外一种实现方法是创建另外一个类,这个类继承uic生成的类,然后在新创建的这个类里面添加额外的功能。

          如下是实现代码:

          头文件logindialogImpl.h的代码:

            #include    "logindialog.h"

            class    LoginDialogImpl : public  LoginDialog

            {

                         Q_OBJECT           

               public:

                          LoginDialogImpl(QWidget *parent = 0,  const char  *name = 0); 

               public  slots:

                           virtual void  checkPasswd();

              };

              源文件logindialogImpl.cpp的代码:

               #include  qlineedit.h

              #include  "logindialogimpl.h"

              #include  "mainform.h"

 

               LoginDialogImpl::LoginDialogImpl(QWidget *parent,  const  char  *name)  

                        :  LoginDialog(parent, name)

              {

                              //在这里加入初始化代码

               }

                 void  LoginDialogImpl::checkPasswd()

                  {                    

                         if  (nameEdit->text() == "myname" 

                             &&  passwdEdit->text() == "mypasswd")

                         {

                                        MainForm * form = new   MainForm;

                                         form->show();

                                         this->hide();

                          }

              }

             提示:喜欢使用子类这种方法的开发者可以称基类为LoginDialogBase, 派生类为LoginDialog, 这样可以使具有完全功能的类有比较好的名称。

              至此这个例子也经完成,重新输入qmake  -project,qmake, make编译,并执行程序看看是效果。

投 票

觉得本文不错,投一票   

评 论

  • 嵌入式在线网友  2008-4-14 13:10:28
  • 嵌入式在线网友
    写的很精彩,出本书吧 。
  • 嵌入式在线网友  2008-4-24 9:17:11
  • 嵌入式在线网友
    不错
  • 嵌入式在线网友  2008-4-24 15:59:28
  • 嵌入式在线网友
    请问你的这个例子是用qt/embedded,作的吗,我用qt/embedded,会出现错误
    [maidisula@localhost ~]$ cd wdwj/wdzl/qt/test/helloworld/
    [maidisula@localhost helloworld]$ qmake -project
    [maidisula@localhost helloworld]$ qmake
    [maidisula@localhost helloworld]$ make
    g++ -c -pipe -DQWS -fno-exceptions -fno-rtti -O2 -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/local/arm/qte/mkspecs/default -I. -I. -I/usr/local/arm/qte/include -o helloworld.o helloworld.cpp
    g++ -Wl,-rpath,/usr/local/arm/qte/lib -o helloworld helloworld.o -L/usr/local/arm/qte/lib -lqte-mt
    /usr/bin/ld: skipping incompatible /usr/local/arm/qte/lib/libqte-mt.so when searching for -lqte-mt
    /usr/bin/ld: cannot find -lqte-mt
    collect2: ld 返回 1
    make: [helloworld] 错误 1
    不知是什么原因,谢谢
  • 從新開始  2008-4-25 17:27:22
  • 從新開始
    如果你用QT/Embedded的话有两个地方你需要修改一下的:
    1、第二个qmake那里加上你目标平台。比如说你的QT/Embedded编译时的目标平台是ARM,那么应该这样输入:
    qmake -spec $ QTDIR /mkspecs/qws/linux-arm-g++
    2、 生成的Makefile可能要修改一下。找到 -lqte ,如果不是 -lqte-mt,那么请你把 -lqte 改为 -lqte-mt
    另处要注意的就是你生成的执行文件要在开发板上运行,如果想在主机执行话要安装 qvfb 这个工具来执行。
  • 嵌入式在线网友  2008-5-4 9:50:37
  • 嵌入式在线网友
    谢谢你的回答


验证码: 看不清?换一张