Top

ESD QT DAY01

  1. 显示"Hello, Qt!"标签
  2. 显示中文的下压按钮
  3. 点击"关闭"按钮,关闭标签
  4. 主窗口

1 显示"Hello, Qt!"标签

1.1 问题

利用qmake生成工程文件和Makefile。

1.2 方案

qmake是一个协助简化跨平台进行专案开发的构建过程的工具程序,Qt附带的工具之一 。首先,qmake可以利用源文件(包括头文件h,实现文件cpp,qt的ui文件等等)生成各种不同类型的工程文件(.pro),然后由.pro文件生成Makefile文件,Makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的头文件,可执行文件要求包含的目标文件模块及库等)。然后使用make工具根据Makefile文件,的依赖和编译命令生成对应的目标文件(.o),最后将其链接输出并生成可执行文件。

1.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:建立工作目录hello,并进入hello目录。

$cd
$mkdir hello
$cd  hello

步骤二:编写源程序hello.cpp

在终端输入编辑命令:

$vim  hello.cpp

代码如下:

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QTextCodec>
int main(int argc,char *argv[]){
    QApplication   app(argc,argv);
    QLabel   qlab("Hello QT!");
    qlab.show();
    return   app.exec();
}

上述代码中,以下代码:

QApplication   app(argc,argv);

根据构造函数构建qt应用程序对象,两个参数必须写。

上述代码中,以下代码:

QLabel   qlab("Hello QT!");
qlab.show();

构建标签对象,并在标签中显示’Hello QT!’;

调用标签show函数,让标签显示在屏幕上。

上述代码中,以下代码:

return   app.exec();

让程序进入事件循环

步骤三:使用qmake命令生成工程文件(.pro)

qmake –project  

生成 hello.pro,在Qt5中使用的是widget,所以要在hello.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。

QT+=widgets  

步骤四:使用qmake命令生成Makefile

qmake hello.pro

生成 Makefile。

步骤五:使用make编译,运行

make

生成可执行文件 hello

./hello

运行

1.4 完整代码

本案例的完整代码如下所示:

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QTextCodec>
int main(int argc,char *argv[]){
    QApplication   app(argc,argv);
    QLabel   qlab("Hello QT!");
    qlab.show();
    return   app.exec();
}

2 显示中文的下压按钮

2.1 问题

解决中文乱码问题。

2.2 方案

标签控件主要用于信息的显示,按钮控件主要用于跟用户的互动,本案例实现一个中文的按钮,在控件中如果直接设置中文字符串将会乱码,因此需要对字符串进行编码格式的转换。

2.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:建立工作目录button,并进入button目录。

$cd 
$mkdir button
$cd  button

步骤二:编写源程序button.cpp

在终端输入编辑命令:

$vim  button.cpp

代码如下:

#include <QApplication>
#include <QPushButton>
#include <QTextCodec>

int main(int argc,char *argv[]){
QApplication app (argc, argv);
QTextCodec* coder = QTextCodec::codecForName ("utf-8");
		QPushButton btn (coder->toUnicode ("按我!"));
		btn.show ();    
return   app.exec();
}	

上述代码中,以下代码:

QTextCodec* coder = QTextCodec::codecForName ("utf-8");

创建可识别UTF-8编码的文本解码器,并将所创建的解码器交给qt的编码翻译器

上述代码中,以下代码:

QApplication   app(argc,argv);

根据构造函数 构建qt应用程序对象,两个参数必须写。

上述代码中,以下代码:

QPushButton btn (coder->toUnicode ("按我!"));
btn.show ();

构建按钮对象,并在按钮上显示’按我!’;

调用按钮对象show函数,让按钮显示在屏幕上。

上述代码中,以下代码:

return   app.exec();
让程序进入事件循环

步骤三:使用qmake命令生成工程文件(.pro)

qmake -project

生成 button.pro,在Qt5中使用的是widget,所以要在button.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。

QT+=widgets  

步骤四:使用qmake命令生成Makefile

qmake button.pro

生成 Makefile。

步骤五:使用make编译,运行

make

生成可执行文件 button

./button

运行

2.4 完整代码

本案例的完整代码如下所示:

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QTextCodec>
int main(int argc,char *argv[]){
QApplication app (argc, argv);
QTextCodec* coder = QTextCodec::codecForName ("utf-8");
		QPushButton btn (coder->toUnicode ("按我!"));
		btn.show ();    
return   app.exec();
}

3 点击"关闭"按钮,关闭标签

3.1 问题

信号和槽的连接。

3.2 方案

信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,也是QT区别于其它工具包的重要地方。信号和槽是QT自行定义的一种通信机制,它独立于标准的C/C++语言,因此要正确的处理 信号和槽,必须借助一个称为moc(Meta Object Compiler)的QT工具,该工具是一个C++预处理程序,它为高层次的事件处理自动生成所需要的附加代码。

在我们所熟知的很多GUI工具包中,窗口小部件(widget)都有一个回调函数用于响应它们能触发的每个动作,这个回调函数通常是一个指向某个函 数的指针。但是,在QT中信号和槽取代了这些凌乱的函数指针,使得我们编写这些通信程序更为简洁明了。 信号和槽能携带任意数量和任意类型的参数,他们是类型完全安全的。

所有从QObject或其子类(例如Qwidget)派生的类都能够包含信号和槽。当对象改变其状态时,信号就由该对象发射(emit)出去,这就是对象所要做的全部事情,它不知道另一端是谁在接收这个信号。这就是真正的信息封装,它确保对象被当作一个真正的软件组件来使用。槽用于接收信号,但它们是普通的对象成员函数。一个槽并不知道是否有任何信号与自己相连接。而且,对象并不了解具体的通信机制。

你可以将很多信号与单个的槽进行连接,也可以将单个的信号与很多的槽进行连接,甚至于将一个信号与另外一个信号相连接也是可能的,这时无论第一个信号什么时候发射系统都将立刻发射第二个信号。总之,信号与槽构造了一个强大的部件编程机制。

通过信号与槽机制实现关闭标签。

3.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:建立工作目录closelad,并进入closelad目录。

$cd
$mkdir closelad
$cd  closelad

步骤二:编写源程序文件closelad.cpp

代码如下:

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>

int main(int argc,char ** argv)
{
    QApplication app(argc,argv);
    QLabel qlab("hello qt");
    QPushButton qpush("close lab");
    qlab.show();
    qpush.show();
    QObject::connect(&qpush,SIGNAL(clicked()),
            &app,SLOT(closeAllWindows()));
    app.exec();
}

上述代码中,以下代码:

QApplication   app(argc,argv);

根据构造函数 构建qt应用程序对象,两个参数必须写。

上述代码中,以下代码:

QLabel qlab("hello qt");
qlab.show();

构建标签对象,并在标签上显示’hello qt’;

调用标签对象show函数,让标签显示在屏幕上。

上述代码中,以下代码:

QPushButton qpush("close lab");
qpush.show();

构建按钮对象,并在按钮上显示’close lab’;

调用按钮对象show函数,让按钮显示在屏幕上。

上述代码中,以下代码:

QObject::connect(&qpush,SIGNAL(clicked()),
            &app,SLOT(closeAllWindows()));

将按钮对象的clicked信号连接到标签对象的close槽上。

上述代码中,以下代码:

return   app.exec();

让程序进入事件循环

步骤三:使用qmake命令生成工程文件(.pro)

qmake -project

生成 closelab.pro,在Qt5中使用的是widget,所以要在closelab.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。

QT+=widgets  

步骤四:使用qmake命令生成Makefile

qmake closelab.pro

生成 Makefile。

步骤五:使用make编译,运行

make

生成可执行文件 closelab

./ closelab

运行

3.4 完整代码

本案例完整代码如下所示:

#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>

int main(int argc,char ** argv)
{
    QApplication app(argc,argv);
    QLabel qlab("hello qt");
    QPushButton qpush("close lab");
    qlab.show();
    qpush.show();
    QObject::connect(&qpush,SIGNAL(clicked()),
            &app,SLOT(closeAllWindows()));
    app.exec();
}

4 主窗口

4.1 问题

点击按钮关闭标签和主窗口。

4.2 方案

实现一个父窗口,在父窗口里面显示标签和关闭按钮,利用Qt中的信号与槽机制,实现当点击关闭按钮,关闭整个父窗口。

4.3 步骤

实现此案例需要按照如下步骤进行。

步骤一:建立工作目录parentwindow,parentwindow并进入目录。

$cd
$mkdir parentwindow
$cd  parentwindow

步骤二:编写源程序文件parentwindow.cpp

在终端输入编辑命令:

$vim  parentwindow.cpp

代码如下:

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>

int main(int argc,char** argv)
{
        QApplication app(argc,argv);
        QWidget* parent = new QWidget();
        parent->resize(512,512);
        parent->move(200,200);
        QLabel* qlab = new QLabel("hello qt!",parent);
        qlab->show();
        qlab->move(0,200);
        QPushButton* qpush = new QPushButton("closelab",parent);
        qpush->show();
        qpush->resize(100,20);
        qpush->move(256,200);
        parent->show();
        QObject::connect(qpush,SIGNAL(clicked()),parent,SLOT(close()));
        return app.exec();
}

上述代码中,以下代码:

QApplication   app(argc,argv);

根据构造函数 构建qt应用程序对象,两个参数必须写。

上述代码中,以下代码:

QWidget* parent = new QWidget();
parent->resize(512,512);
parent->move(200,200);

创建一个父窗口,

调整父窗口大小,

调整父窗口位置,相对屏幕左上角

上述代码中,以下代码:

QLabel* qlab = new QLabel("hello qt!",parent);
qlab->show();
qlab->move(0,200);

构建标签对象,在标签中显示’hello qt!’,并指定父窗口为parent,

相对于父窗口左上角位置。

上述代码中,以下代码:

QPushButton* qpush = new QPushButton("closelab",parent);
	qpush->show();
qpush->resize(100,20);
qpush->move(256,200);

构建按钮对象,在按钮上显示’ closelab’,指定其父窗口为parent;

同时设置按钮对象的大小,按钮对象初始位置。

上述代码中,以下代码:

parent->show();

显示父窗口。

上述代码中,以下代码:

QObject::connect(qpush,SIGNAL(clicked()),parent,SLOT(close())); 

点击按钮关闭父窗口。

上述代码中,以下代码:

return   app.exec();

让程序进入事件循环

步骤三:使用qmake命令生成工程文件(.pro)

qmake -project

生成 parentwindow.pro,在Qt5中使用的是widget,所以要在parentwindow.pro文件中添加 QT+=widgets 表示引入 QtWidget这个module,qmake会在帮你生成Makefile的时候,设置好widgets头文件路径和 widgets库文件路径。

QT+=widgets  

步骤四:使用qmake命令生成Makefile

qmake parentwindow.pro

生成 Makefile。

步骤五:使用make编译,运行

make

生成可执行文件 parentwindow

./ parentwindow

运行

4.4 完整代码

本案例完整代码如下所示:

#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>

int main(int argc,char** argv)
{
        QApplication app(argc,argv);
        
       QWidget* parent = new QWidget();
        
        parent->resize(512,512);
        
        parent->move(200,200);

        QLabel* qlab = new QLabel("hello qt!",parent);
        qlab->show();
        qlab->move(0,200);

        QPushButton* qpush = new QPushButton("closelab",parent);
       
qpush->show();
        qpush->resize(100,20);
        qpush->move(256,200);
        
      
        parent->show();
               
        QObject::connect(qpush,SIGNAL(clicked()),parent,SLOT(close()));

        return app.exec();
}