您的位置:首页 > 编程语言 > Qt开发

5)~Qt~Desinger小观与qmake设置与使用

2010-11-28 19:55 423 查看
Desinger

是一个可视化的工具,尤其可以使布局简单,不过总有强人告诉我直接用代码更好~o(╯□╰)o

还是先来学习这个吧。

无论用编写代码的方式还是用Qt Designer,创建对话框都有如下基本的步骤:
1、创建和初始化子控件。
2、把子控件放到布局管理器中。
3、设置tab顺序。
4、创建信号和槽。
5、实现对话框的自己的槽函数。

然后我们设计一个有个textlabel,一个lineEdit,一个分隔符,2个pushbutton的小对话框,其中按钮一个是okButton和cancelButton把对话框设计好以后,保存为.ui文件。其中制作过程可以参考那本with Qt 4(宝书)。然后用文本编辑器写一个main.cpp放到同一文件夹下。

这段要说一下了,我们可以直接我creator,但是为了了解qmake,先这么做。

#include <QApplication>
#include <QDialog>
#include "ui_gotocelldialog.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
Ui::GoToCellDialog ui;
QDialog *dialog = new QDialog;
ui.setupUi(dialog);
dialog->show();
return app.exec();
}

这段代码以后也要修改。

然后运行qmake

现在来了解qmake,qmake是个什么东西呢,qmake可以使你的纯文本编译的代码生成.pro文件,然后再生成Makefile。之后也可以生成.exe。就是说qmake自动帮你完成了编译器要完成的功能。我们用creator来做其实是一样的顺序。只不过界面更加友好简便了。

那么在控制台下(windows)

我推荐用Qt Command Prompt,不用设置太麻烦的环境变量,还可以在其中输入-edit直接来写代码。

环境变量的设置见后面的附录

qmake -project

qmake ***.pro

就可以了,qmake非常的天才,可以自动检测ui并且转化成等价的头文件。

然后我们run一下发现可以看,就是不能用。然后就这本书就创建一个新类,此类继承自QDialog和ui,实现功能,废话少说。代码如下

gotocelldialog.h

#ifndef COTOCELLDIALOG_H

#define GOTOCELLDIALOG_H

#include <QDialog>

#include "ui_gotocelldialog.h"

class GoToCellDialog : public QDialog, public Ui::GoToCellDialog//继承了2个

{

Q_OBJECT

public:

GoToCellDialog(QWidget *parent = 0);

private slots:

void on_lineEdit_textChanged();//如果用on_objectName_signalName()命名的任意槽与相应的objectName()的signalName()

//自动连接这是很方便的一种机制。

};

#endif

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·

gotocelldialog.cpp

#include <QtGui>

#include "gotocelldialog.h"

GoToCellDialog::GoToCellDialog(QWidget *parent)

:QDialog(parent)

{

setupUi(this);

QRegExp RegExp("[A-Za-z][1-9][0-9]{0,2}");//这里复制下原著

Qt提供了三个许可器类:QIntValidator,QDoubleValidator和QRegExpValidator。这里我们使用了QRegExpValidator,使用的表达式为“[A-Za-z][1-9][0-9]{0,2}”这个表达式的意思是第一个字符输入为大写或者小写字母,第二个字符为一个数字范围是1到9,第三个字符是一个数字范围为0到9。在QRegExpValidator的构造函数中,第二个参数为this,把当前类作为它的父控件,这样就可以不用删除它,父控件析构时可以被自动删除。
Qt的父子机制在QObject中实现的。当我们创建一个带有父的对象(如一个子控件,一个许可器,布局管理器等)时,父对象把子对象放到自己的子对象列表中。父对象被删除时,它查找自己的子对象并把每一个删除掉。这些子对象再把自己的子对象删除掉,如此递归,知道删除所有对象。
这种父子对象的机制简化了内存管理,减少了内存泄漏的危险。需要程序员删除的对象就是我们使用new创建的没有父对象的对象。如果我们在父对象存在时删除了它的一个子对象,Qt将会在父列表中自动删除。(需要记住的是Qt只是删除有父的对象,父对象还是需要手动删除的,还有就是那些用new申请的没有指定父的内存,一般情况下,在对话框里的子控件,许可器和布局管理器由Qt自己管理,其他还要程序员小心删除)
对于控件来讲,父对象还有一个意义:子控件在父对象的显示区域内显示。当父控件删除后,子控件不但在内存中被删除,它也同时在屏幕上消失。
在构造函数的最后两行,把QDialog的accept()函数连接到OK按钮的点击信号,把Cancel按钮的点击信号连接到reject()函数。这两个槽函数都关闭这个对话框,但是accept()返回 QDialog::Accepted(值为1),reject()返回值为QDialog::Rejected(值为0)。不同的返回值可以判断用户点击了那个按钮。
on_lineEdit_textChanged()槽函数控制Ok按钮的可用状态,通过编辑框中的输入字符,如果字符有效Ok按钮则有效,否则为不可用状态。QLineEdit::hasAcceptableInput()根据我们在构造函数中设置的许可器返回bool值。

lineEdit->setValidator(new QRegExpValidator(RegExp,this));

connect(okButton,SIGNAL(clicked()),this,SLOT(accept()));

connect(cancelButton,SIGNAL(clicked()),this,SLOT(reject()));

}

void GoToCellDialog::on_lineEdit_textChanged()

{

okButton->setEnabled(lineEdit->hasAcceptableInput());

}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

最后我们修改的main.cpp

#include<QApplication>//#include<QDialog>

#include"gotocelldialog.h"

int main(int argc , char *argv[])

{

QApplication app(argc, argv);

GoToCellDialog *dialog = new GoToCellDialog;

//ui.setupUi(dialog);

dialog->show();

return app.exec();

}

然后我们一样
qmake -project

qmake ***pro

之后我们就可以看到一个很不错的对话框了。但是我还是推荐用creator的方式来写,因为这个要是写错了,根本不知道那里有的问题。

不过这么先这么写一下,了解一下以后是有用的。

附录:

Qt环境变量的设置可以可以参考Qt安装目录bin文件夹下的qtenv.bat的设置,比如我的安装路径为D:/study/program/qt,那么该目录就在D:/study/program/qt/bin/qtenv.bat,其内容为:

@echo off
rem
rem This file is generated
rem
echo Setting up a MinGW/Qt only environment...
echo -- QTDIR set to D:/study/program/qt/qt
echo -- PATH set to D:/study/program/qt/qt/bin
echo -- Adding D:/study/program/qt/bin to PATH
echo -- Adding %SystemRoot%/System32 to PATH
echo -- QMAKESPEC set to win32-g++
set QTDIR=D:/study/program/qt/qt
set PATH=D:/study/program/qt/qt/bin
set PATH=%PATH%;D:/study/program/qt/bin;D:/study/program/qt/mingw/bin
set PATH=%PATH%;%SystemRoot%/System32
set QMAKESPEC=win32-g++

上面是批处理代码,其涵义简述如下:

@:表示后面的命令不回显

echo:命令参数为[on] [off] [message] 分别表示[以后的命令都显示][都不显示][显示message]

rem:是注释用的。

set:命令参数为[variable=[string]]用来显示,设置或删除环境变量,variable为变量名,string为其值。

那么,环境变量的设置方法为:

(1)、右键单击“我的电脑”-“属性”-“高级”-“环境变量”-“系统变量”

(2)、“新建”,变量名设置为:QTDIR,变量值设置为:D:/study/program/qt/qt

(3)、同2,“新建”,变量名设置为:QMAKESPEC,变量值设置为:win32-g++

(4)、path变量一般都会有,只要添加就行了,双击path变量,在变量值后面添加:;D:/study/program/qt/qt/bin;D:/study/program/qt/bin;D:/study/program/qt/mingw/bin;%SystemRoot%/System32

(5)、上述变量和值必须和qtenv.bat中的对应,然后就OK了。

---------------------------------------------------------------------------------------------------------------------------------

下面是我添加的修改注册表的方法:

@echo off
rem @ 后面的语句不回显
rem echo off 后面的所有命令不回显
reg add "HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" /v QTDIR /d "D:/study/program/qt/qt" /t Reg_SZ /f
reg add "HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" /v Path /d "%path%;D:/study/program/qt/qt/bin;D:/study/program/qt/bin;D:/study/program/qt/mingw/bin;%SystemRoot%/System32" /t REG_EXPAND_SZ /f
reg add "HKLM/SYSTEM/CurrentControlSet/Control/Session Manager/Environment" /v QMAKESPEC /d "win32-g++" /t Reg_SZ /f
pause

上面代码保存为qt.bat,双击运行即可,注意:里面红颜色的部分请与你的qtenv.bat对应部分对应好,如果怕误操作,请先备份注册表。

转载自:http://hi.baidu.com/秀才太守
[/code]
我就是照着这个来弄的。不过我一直用的是Qt Command Prompt。

推荐用这个哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: