• 66217阅读
  • 44回复

【原创】学习QT4初步编程 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-06-30
Trolltech近日刚刚发布了QT4,它和QT3有较大的不同,同时For Windows的OpenSource版本也推出了,广大C++爱好者可以在Windows下也方便地使用它了。

第一步,先安装它
在Trolltech的官方网站上,可以下载到For windows和MingW的安装文件:
http://www.trolltech.com/download/qt/windows.html


或者,到本论坛的下面网址去下载:

http://www.qtcn.org/bbs/read.php?tid=1075
因为我们将使用MingW来作为编译器。
下载完后,直接安装,如果您已经安装了MingW(比如Dev-C++就有MingW),则在安装过程中指定MingW的位置,如果没有安装,则选择现在下载,安装过程会自动下载并安装。
安装完成后。就可以使用了。

MinGW的安装,您可以到官方网站下载:
http://www.mingw.org


第二步,安装完后,就可以使用了。我们先用QT Designer设计一个窗体。
OpenSoruce版本的QT Designer功能比较的简单,只能设计窗体布局以及连接已有的信号与槽,这给我们带来了许多的不便(有For Windows的OpenSource版本使用已经很不错啦)
先用QT Designer设计一个窗体,设定可以设定的信号连接,然后把它保存为一个.ui文件
,比如form1.ui
然后,打开QT Command prompt控制台,切换到保存.ui文件的那个目录下面,然后运行下面命令:

uic form1.ui > form1.h


这是,大家会看到下面的代码:

#ifndef UNTITLED_H
#define UNTITLED_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QGridLayout>
#include <QtGui/QLineEdit>
#include <QtGui/QListWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QPushButton>
#include <QtGui/QWidget>

class Ui_MainWindow
{
public:
  QWidget *centralWidget;
  QGridLayout *gridLayout;
  QPushButton *pushButton_2;
  QLineEdit *lineEdit;
  QPushButton *pushButton;
  QListWidget *listWidget;

  void setupUi(QMainWindow *MainWindow)
  {
  MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
  MainWindow->resize(QSize(218, 294).expandedTo(MainWindow->minimumSizeHint()));
  centralWidget = new QWidget(MainWindow);
  centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
  gridLayout = new QGridLayout(centralWidget);
  gridLayout->setSpacing(6);
  gridLayout->setMargin(8);
  gridLayout->setObjectName(QString::fromUtf8("gridLayout"));
  pushButton_2 = new QPushButton(centralWidget);
  pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));

  gridLayout->addWidget(pushButton_2, 2, 1, 1, 1);

  lineEdit = new QLineEdit(centralWidget);
  lineEdit->setObjectName(QString::fromUtf8("lineEdit"));

  gridLayout->addWidget(lineEdit, 1, 0, 1, 2);

  pushButton = new QPushButton(centralWidget);
  pushButton->setObjectName(QString::fromUtf8("pushButton"));

  gridLayout->addWidget(pushButton, 2, 0, 1, 1);

  listWidget = new QListWidget(centralWidget);
  listWidget->setObjectName(QString::fromUtf8("listWidget"));

  gridLayout->addWidget(listWidget, 0, 0, 1, 2);

  MainWindow->setCentralWidget(centralWidget);
  retranslateUi(MainWindow);

  QMetaObject::connectSlotsByName(MainWindow);
  } // setupUi

  void retranslateUi(QMainWindow *MainWindow)
  {
  MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow"));
  pushButton_2->setText(QApplication::translate("MainWindow", "PushButton"));
  pushButton->setText(QApplication::translate("MainWindow", "PushButton"));
  Q_UNUSED(MainWindow);
  } // retranslateUi

};

namespace Ui {
  class MainWindow: public Ui_MainWindow {};
} // namespace Ui

#endif // UNTITLED_H



我并不喜欢上面的自动生成的代码,我要对它进行一下整理,同时加上自己的控制

form1.h

#ifndef FORM1_H
#define FORM1_H

#include <QtGui/QGridLayout>
#include <QtGui/QLineEdit>
#include <QtGui/QListWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QPushButton>

class Form1: public QMainWindow
{
Q_OBJECT
public:
    Form1();
public slots:
    void insertItem();
public:
  QWidget *centralWidget;
  QGridLayout *gridLayout;
  QLineEdit *lineEditString;
  QPushButton *pushButton_Quit;
  QPushButton *pushButton_Insert;
  QListWidget *listWidgetList;
};

#endif // FORM1_H



form1.cpp

#include <QMessageBox>
#include <QString>
#include "form1.h"

Form1::Form1()
{
  this->resize(QSize(194, 323).expandedTo(this->minimumSizeHint()));
  centralWidget = new QWidget(this);
  gridLayout = new QGridLayout(centralWidget);
  gridLayout->setSpacing(6);
  gridLayout->setMargin(8);
  lineEditString = new QLineEdit(centralWidget);

  gridLayout->addWidget(lineEditString, 1, 0, 1, 2);

  pushButton_Quit = new QPushButton(tr("Quit"), centralWidget);

  gridLayout->addWidget(pushButton_Quit, 2, 1, 1, 1);

  pushButton_Insert = new QPushButton(tr("Insert"), centralWidget);

  gridLayout->addWidget(pushButton_Insert, 2, 0, 1, 1);

  listWidgetList = new QListWidget(centralWidget);

  gridLayout->addWidget(listWidgetList, 0, 0, 1, 2);

  this->setCentralWidget(centralWidget);
  QObject::connect(pushButton_Quit, SIGNAL(clicked()), this, SLOT(close()));
  QObject::connect(pushButton_Insert, SIGNAL(clicked()), this, SLOT(insertItem()));
 
  setWindowTitle(tr("Test Program"));
}

void Form1::insertItem()
{
  QString strInsert = lineEditString->text();
  if (strInsert.isEmpty())
  {
  QMessageBox::warning(this, tr("Alert"),
                        tr("You have not input any character"),
                        tr("OK"));
          lineEditString->setFocus();
  }
  else
  {
      listWidgetList->addItem(lineEditString->text());
      lineEditString->clear();
  }
}



再加上一个主函数

main.cpp

#include <QApplication>
#include <QTranslator>
#include "form1.h"

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  Form1 form1;
  form1.show();
  return app.exec();
}




这样,我们就写完一个基本的函数了,但,我们要加入多语言支持的,现在还不行。于是,修改主函数:

#include <QApplication>
#include <QTranslator>
#include "form1.h"

int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  QTranslator translator;
  translator.load(QString("ex5_") + QString(argv[1]));
  app.installTranslator(&translator);
  Form1 form1;
  form1.show();
  return app.exec();
}



我们用参数,控制程序使用哪种语言.
接下来,就需要翻译了,
打开控制台,用lupdate命令生成.ts文件

lupdate form1.cpp -ts ex5_en.ts


我们再把上面的ex5_en.ts文件复制两份,分别命名为ex5_zh_CN.ts和ex5_zh_TW.ts,再下来,我们就可以使用Qt Linguish翻译工具,来翻译我们想要的语言了。
翻译完这三个.ts文件后,把他们保存了,并且发布了(也就是运行菜单lrelease命令,它会生成.ts对应的qm文件)。

再接下来,就需要生成工程文件了。
在控制台下运行下面命令:

qmake -project

完成后,它就会生成下面内容的文件:

######################################################################
# Automatically generated by qmake (2.00a) ??? ?? 30 20:57:58 2005
######################################################################

TEMPLATE = app
DEPENDPATH += .
INCLUDEPATH += .

# Input
HEADERS += form1.h
SOURCES += form1.cpp main.cpp
TRANSLATIONS += ex5_en.ts ex5_zh_CN.ts ex5_zh_TW.ts



然后,运行qmake命令生成Makefile文件,再运行make命令,来进行编译

qmake
make


编译完成后,就会在Release目录下面生成ex5.exe文件,把它拷贝到上层目录中,在控制台上运行下面命令就可以产生相应语言的界面效果了

ex5 zh_CN
ex5 zh_TW
ex5 en


末尾,我把源程序压缩了上传上来
[ 此贴被XChinux在2005-08-21 14:35重新编辑 ]
附件: ex5.rar (44 K) 下载次数:1272
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线eryue
只看该作者 1楼 发表于: 2005-08-11
好贴子,我要是早看见,就不会因为不会用而把我的WinQt4删掉了,辛苦了!
离线XChinux

只看该作者 2楼 发表于: 2005-08-11
这个帖子不完美,应该再写一个来着,可是懒.......一直没动手
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 3楼 发表于: 2005-08-17
请问每个用DESIGNER设计的程序都要像版大改的那么多么..
*.UI >* .H 后不能直接用呀?
离线XChinux

只看该作者 4楼 发表于: 2005-08-17
不用那样的改了,不推荐采用这种方式。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 5楼 发表于: 2005-08-17
可以自动生成MAIN.CPP 么?
离线XChinux

只看该作者 6楼 发表于: 2005-08-17
不行
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 7楼 发表于: 2005-08-17
我从那里能知道改这个ui生成的.h文件的方法呢?
现在只能用手敲些例子   没法用designer..
离线XChinux

只看该作者 8楼 发表于: 2005-08-17
开源版的QT Designer只能提供界面设计和已知signal和slot的connect功能,还有属性设置。
不能自定义slot,不能自定义signal,所以,现在推荐的方法只能是Designer只生成界面,而自己新建类,在类中增加自定义的signal和slot。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 9楼 发表于: 2005-08-17
谢谢!
就是要把用designer生成的ui代码改成myMainWindows里的类和函数么?
我刚学qt可以加版大的qq问些问题么.
[ 此贴被血魔在2005-08-17 22:16重新编辑 ]
离线XChinux

只看该作者 10楼 发表于: 2005-08-17
参考这个帖子 :
http://www.qtcn.org/bbs/read.php?tid=97
[ 此贴被XChinux在2005-08-20 06:02重新编辑 ]
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 11楼 发表于: 2005-08-18
版主大大。 刚才仿造你的程序 我把类似hello world 的 QUIT 调试了出来
哈哈 我是不是好菜的~~~~~
谢谢拉   看到我把你的巨作用来改这种东东 是不是好郁闷。。
不过我学了不少东东 谢谢哈 委屈的你的原创。。。。。。
离线XChinux

只看该作者 12楼 发表于: 2005-08-18
共同学习共同学习,呵呵。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 13楼 发表于: 2005-08-18
要睡觉拉。 版大 早上起来是
我想问下:我机子屏幕颜色去乱拉 装的是红旗4。1。windows没事。请问是怎么拉哈。
谢谢
离线XChinux

只看该作者 14楼 发表于: 2005-08-18
是不是LINUX驱动的问题?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线血魔
只看该作者 15楼 发表于: 2005-08-18
版大 你的这个程序 和 "改H文件"的程序 那个是标准的阿.......
我看"改H文件" 哪个看的有点乱,............
离线acefunware

只看该作者 16楼 发表于: 2005-08-19
感觉qt4到3的变化好大
在designer 中 功能似乎变少了

用的不太顺手啊
email:acefunware@yahoo.com.cn
blog:http://acefunware.shineblog.com
离线XChinux

只看该作者 17楼 发表于: 2005-08-19
下面是引用血魔于2005-08-18 10:46发表的:
版大 你的这个程序 和 "改H文件"的程序 那个是标准的阿.......
我看"改H文件" 哪个看的有点乱,............


无所谓标准不标准,喜欢用哪种用哪种。本来界面设计,不用QT Designer也行,QT Designer只是起辅助作用,它不是必要的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线cox
只看该作者 18楼 发表于: 2005-10-20
不错的例子,很好的版主
只看该作者 19楼 发表于: 2005-10-29
太繁琐,还是QT+VC6最简单。。。。。调试和编写都方便简洁。
离线bjtony

只看该作者 20楼 发表于: 2006-01-09
谢谢
离线lcy0671

只看该作者 21楼 发表于: 2006-01-16
感觉QT4的UIC十分的垃圾。还是QT3,QT2的好用。
离线macping

只看该作者 22楼 发表于: 2006-02-27
我用的是Readhat 9.0+qt designer 3.1.1怎么跟楼主说的不一样呢
离线yihect

只看该作者 23楼 发表于: 2006-03-24
怎么链接不成功,提示说找不到 -lqtmaind
离线XChinux

只看该作者 24楼 发表于: 2006-03-24
Re:怎么链接不成功,提示说找不到 -lqtmaind
引用第23楼yihect2006-03-24 13:39发表的“怎么链接不成功,提示说找不到 -lqtmaind”:
[表情] [表情] [表情] [表情]


这是说你没有debug库,
你需要先编译debug库。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线hohonet
只看该作者 25楼 发表于: 2006-03-24
强,多谢楼主!
QT确实是个好东东!
离线yihect

只看该作者 26楼 发表于: 2006-03-25
多谢总版主,呵呵,建debug lib 后的确是可以的。
只看该作者 27楼 发表于: 2006-04-06
先试试,谢谢楼主
离线chinayin
只看该作者 28楼 发表于: 2006-04-10
由於我们要常常用到 QT Designer, 也就是说,需要常常用到 uic 这苹程式. 为了省去每次都要
打一堆东西的麻烦.我们来写一各小 script 来处理 .ui 档案.
不难看出, uic 在处理/生成 .h .cpp 档案的时侯,用到了两个指令∶

uic -o form1.h form1.ui
uic -i form1.h -o form1.cpp form1.ui

所以我们的 script 就写成∶

###############################################################
#!/bin/sh                                   #
# myuic program convert .ui to .cpp .h by calling uic       #
                                        #
INPUT_UI=$@                                   #
#这里读取外面传回来的文件名                       #
                                        #
                                        #
if [ ! -f "$INPUT_UI" ]                           #
then                                       #
echo "UIC File $INPUT_UI Not Found"                   #
echo                                       #
echo "Userage myuic input_file.ui"                   #
echo                                       #
exit 1                                     #
fi                                         #
#上面的语句检查我们所输入的.ui文件是否存在             #
#如果找不到指定的.ui文件,则显示一个简短的               #
#使用说明                                   #
                                        #
INPUT_H=`echo $@ | cut -d '.' -f1`.h                 #
#这里我们利用 cut 来处理输入的 .ui 文件.               #
#得到一个 .h 的文件名                           #
                                        #
INPUT_CPP=`echo $@ | cut -d '.' -f1`.cpp               #
#同样的道理,利用 cut 产生一个 .cpp 的文件名             #
                                        #
uic -o $INPUT_H $INPUT_UI                         #
#这里就是利用 .ui 产生 .h 的文件                     #
                                        #
uic -i $INPUT_H -o $INPUT_CPP $INPUT_UI               #
#利用 .h 和 .ui 产生 .cpp 文件.                     #
                                        #
###############################################################

我门把这个文件存为 myuic. 并切 chmod +x 变成可执行档案.
然後 cp 到 /usr/bin 上面. 如果您在电脑中没有 root 的权限.
可以在自己的 $HOME 目录中做一个 bin 的 Directory 出来.
然後去编辑您的 .bash_profile (这里假设您用的是 bash)
如果您的 .bash_profile 中本身已经有了 PATH 这段文字,那麽
您只要在原本的 PATH 後面加上 :$HOME/bin就可以了.如果没有
那麽就在您的 .bash_profile 中写入∶

PATH=$PATH:$HOME/bin

export PATH

这样您以後就可以直接执行 myuic 这个文件了.现在试试看用 myuic 来处理
刚刚的那个 form1.ui 这个文件吧. 先把旧的 .h .cpp 都删除掉∶
rm -f *.cpp *.h
然後用 myuic 来生成新的 .cpp .h 文件∶
myuic form1.ui
这时候用 ls 就会看到 form1.cpp form1.h form1.ui 这三个文件了

这时侯我们只需要写一个小的main.cpp就可以编译form1.cpp了.
main.cpp非常的简单

#include "form1.h"
#include <kapp.h>

int main(int argc, char **argv)
{
   KApplication app(argc, argv, "Form1"); //KDE 是建立在QT的基础上得所以KApplication
                        //所以kapp.h实际上包含了qapplication.h
   Form1 *form1=new Form1();      
   form1->show();
   app.setMainWidget(form1);
   return(app.exec());
}

从其他地方看的,不知有没有用!
离线feihui89
只看该作者 29楼 发表于: 2006-04-14
文字文字文字

哎~~~~~~~
真烦恼,想学又看不懂
该怎么办啊。。。。。
可否告知如何才能对这个“熟悉”啊。。。。。


…………………………
…………………………
…………………………
[p:4]
做自己喜欢做的事;
让别人去说。……
离线XChinux

只看该作者 30楼 发表于: 2006-04-14
多看例子,多实践
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线feihui89
只看该作者 31楼 发表于: 2006-04-18
这个我也知道啊,但是我不懂啊!!!!!!

我想请问一下那个代码是怎么回事,这个东西要怎么理解啊.
麻烦告知

谢谢!~~~~~~
做自己喜欢做的事;
让别人去说。……
离线jollyjia

只看该作者 32楼 发表于: 2006-05-09
uic -i form1.h -o form1.cpp form1.ui

这个命令好像不对啊,
我的QT4里面的uic根本就没有-i这个参数阿?
怎么回事?
版大回答一下啊~~?!
离线backup
只看该作者 33楼 发表于: 2006-07-29
楼主的ex5.rar压缩包中咋没有.ui文件呢?最好加上
离线sunguoqing9

只看该作者 34楼 发表于: 2008-07-03
不顶不是人啊
离线xiao7
只看该作者 35楼 发表于: 2008-12-27
楼主,小弟是新手 有点诧异那个修改后的.h文件 自动生成的头文件并没有继承QMainWindow那个类 如果直接加上的话就只产生一个最简单的窗口……如果不改的话就会报错 说那个类中没有show();刚刚起步 遇到了很多麻烦……希望楼主指点……谢谢
离线lennyf

只看该作者 36楼 发表于: 2009-01-07
又学到东西了:)
离线cxjnet
只看该作者 37楼 发表于: 2009-01-07
做个记号

回家看
离线zcm860427
只看该作者 38楼 发表于: 2009-02-18
上面的有.cpp.h和mian.cpp不能直接编译吗?就是新建一个人后直接添加进去,不知道行不行啊??
离线piero10pj
只看该作者 39楼 发表于: 2009-02-19
新手。。纯新手。。学习学习!谢谢楼主分享!
快速回复
限100 字节
 
上一个 下一个