QT提供了设计师工具,可以很方便的使用鼠标拖拽的方式绘制界面。绘制完毕后自动生成一个界面的.h文件(如ui_mainwindow.h),其中含有一个自动生成的Ui_MainWindow类,这个类中核心的函数是setupUi,根据界面向导的不同里面接收一个QWidget *参数或者QMainWindow *参数。这个函数会自动在传入的QWidget或QMainWindow上根据设计师绘制的界面创建可视化控件。使用这个自动生成的类有两种方式,一是在定义QWidget或QMainWindow时创建一个Ui_MainWindow类型的成员ui,在构造函数中调用其setupUi方法ui.setupUi(this),或使用C++特有的多继承方式,定义子类的时候同时以Ui_MainWindow作为基类,在构造函数中直接调用setupUi(this).这时已经可以在自定义部件子类中显示绘制的界面了。要访问绘制界面的可视化控件,根据上述两种方式使用ui->控件名称或者控件名称直接进行引用即可。

这时显示已经没问题了,我们还需要设置界面元素的信号-槽,使之可以响应事件。QT提供了一种默认信号-槽对应关系:on_控件名称_信号函数名称(参数列表).当定义了这样的函数后,QT会将函数自动与界面控件的信号相关联,当控件触发了相关事件后这个函数将会被触发.另外一种方式是直接使用QObject::connect函数来关联信号和槽.语法为:

connect(发出信号的对象指针,SIGNAL(信号函数原型), 响应信号的对象, SLOT(槽函数原型));

这里先说说信号及槽与普通成员函数有什么区别,只是定义的区域不同而已.信号函数需要声明在头文件的signals:关键字后面,无需实现.而槽则需要定义在public/private slots:关键字后面,实现与正常函数一样,可以直接调用,当然调用权限与slots前面的范围控制关键字(public/private)有关.这里强调几点:

1)一个信号可以多次使用connect函数与多个槽关联,信号触发后这些槽不能保证调用顺序,但都会执行一遍.

2)多个信号可以连接同一个槽.

3)信号之间可以互相关联(语法为 connect(对象1,SIGNAL(信号函数原型), 对象2, SIGNAL(信号函数原型))),当第一个信号触发另一个信号也会触发

4)使用disconnect函数移除信号-槽的关联

5)信号与槽的参数必须顺序一致,类型相同,如果信号的参数比槽的参数多,多余的参数被忽略,反之报错.

6)信号与槽的机制不仅仅限于界面开发,普通的类也可以声明信号和槽,并建立关联

触发信号的语法为:  emit 信号名称(实参列表);

使用布局机制组织界面元素:布局控件有QHBoxLayout,QVBoxLayout及QGridLayout.分别是水平布局,垂直布局和网格布局控件.其他控件可放置与其上,当窗体大小改变的时候会自动调整界面元素位置和大小.QT还提供了一个伸展器控件,放置与布局控件的空闲部位使其他元素位置总是居上或居下.

在主窗体上创建菜单栏,工具栏:在头文件中声明QAction对象,每个QAction对应一个菜单栏、工具栏对象。在构造函数中实例化这些Action并将其显示在菜单栏或工具栏上。

newAction = new QAction(tr("&New"), this);

newAction->setIcon(QIcon(":/images/new.png"));//设置资源中的图片文件作为其图标

newAction->setShortcut(QKeySequence::New);//设置快捷键 键值与系统有关

newAction->setStatusTip(tr("Create a new spreadsheet file"));//鼠标经过时显示在状态栏上的文字

connect(newAction, SIGNAL(triggered()), this, SLOT(newFile()));//设置信号-槽关联

fileMenu = menuBar()->addMenu(tr("&File"));//创建顶层菜单 文件菜单

fileMenu->addAction(newAction);//将上面创建的Action添加到菜单上

fileToolBar = addToolBar(tr("&File"));//创建工具栏

fileToolBar->addAction(newAction);//将上面创建的Action添加到工具栏上

如果要创建部件的右键菜单,需要将Action添加到部件,并设置部件的上下文菜单的策略.更高级的实现方式是重写部件的contextMenuEvent方法,创建一个QMenu窗口,在其中添加动作后调用exec()函数.

部件对象->addAction(newAction);

部件对象->setContextMenuPolicy(Qt::ActionsContextMenu);

设置状态栏首先需要向状态栏添加控件用来显示信息.

locationLabel = new QLabel("W999");

locationLabel->setAlignment(Qt::AlignHCenter);

locationLabel->setMinimumSize(locationLabel->sizeHint());

locationLabel->setIndent(3);//设置扩展因子,在状态栏大小发生变化是自动调整区域,默认扩展因子为0,表示大小不发生变化.

statusBar()->addWidget(locationLabel);//向状态栏添加控件

QT启动画面(Splash)用于在程序启动的时候显示信息并等待启动完毕后取消显示.需要写在main()函数中:

QSplashScreen *splash = new QSplashScreen();

splash->setPixmap(':/images/splash.png');

splash->show();

Qt::Alignmeng topRight = Qt::AlignRight | Qt::AlignTop;

splash->showMessage(QObject.tr("要显示的信息"), topRight, Qt::white);

//后面可多次调用showMessage方法向用户显示不同信息.使用完毕关闭之.

splash->finish(&mainWin);//将控制权交给mainWin窗体

delete splash;

QMainWindow的中央窗口部件属性用于指定主窗体中央区域显示的部件,这些部件可以是普通的多行控件,自定义的窗体部件,带布局管理的部件,或切分窗口的QSplitter部件,或用于实现MDI风格的QMdiArea部件.这里说说MDI风格的窗体实现.首先从QMainWindow类继承一个子类,在子类的构造函数中:

mdiArea = new QMdiArea();

setCentralWidget(mdiArea);

mdiArea->addSubWindow(部件类型指针);//将部件(QWidget类型)添加到区域中作为一个子窗口

mdiArea->activeNextSubWindow();//使下一个子窗体为当前活动窗体

mdiArea->activeSubWindow()返回当前子窗体

mdiArea->setActiveSubWindow(子窗体对象指针)//设置当前子窗体.子窗体对象必须包含在mdiArea中,否则报错.

通过上面的函数基本上可以实现MDI窗体了,但是子窗体的打开关闭,或当前子窗体发生变化,都会影响主菜单及工具栏中各项的状态,这里需要灵活应用信号-槽机制,在发生状态变化的时候调整Enabled属性.

自定义QT控件:在继承QWidget实现了特定功能可视化部件后,可以使用插件的方式将其加入QT设计师工具中,这样就可以在设计器用鼠标拖放的方式将自定义的部件添加的窗体中了.首先需要从QDesignerCustomWidgetFnterface继承一个子类,重写几个函数指定控件的名称,所在的组,提示信息等,关键的函数是createWidget方法,返回特定窗口部件的实例.最后在插件源文件的末尾添加Q_EXPORT_PLUGIN2宏将插件注册到设计师.

QT4极大的改善了绘图的刷新效率,但在及特殊情况下也需要使用双缓冲区机制,思路是创建一个QPixmap,需要绘制的图形现在其上绘制完毕后,在触发paintEvent事件时直接将这个pixMap刷到屏幕的图像区域之上.

QT的事件机制:要处理对象的事件,可以重写QObject::event()函数,这个函数会将特定事件进行分发,如鼠标事件mousePressEvent,键盘事件keyPressEvent,及paintEvent等,如果关心特定事件也可以重写这些事件.如果需要定时触发的timer机制,可以重写timerEvent函数.首先int myTimeId = startTimer(时间间隔ms);在timerEvent中:if(event->timerId() == myTimeId) {...........}

QT提供了事件监控机制,在构造函数中调用 对象1->installEventFilter(对象2);这样就可以使用对象2来监控对象1的事件,对象2重写其eventFilter函数,通过target参数来确定事件的发出者,并可以对事件进行干预.QT的事件是从子对象向父对象传递的,如果子对象处理了事件则停止传递.需要注意的是installEventFilter函数是定义在QObject上的,所以可以在QApplication上设置事件监控,控制整个应用程序的事件.重写QApplication::notify()函数可在事件刚发出就截获事件.如果在密集运行时希望界面响应事件,需要调用QApplication::processEvents();方法.

给Qt工程生成的可执行文件添加图标

1.  找一个ico文件,该名为适当的。如EXEICON.ico。 
2.  手动创建一个对应的rc文件。如EXEICON.rc: 
       IDI_ICON1 ICON DISCARDABLE "EXEICON.ico" 
3.  将上面两个文件放在当前目录,把HdssMap.rc加入工程在中。重新生成即可。

给Qt窗体添加图标

在main函数中:

QApplication a(argc, argv);
 a.setWindowIcon(QIcon(":/DataManager/Resources/statics.png"));

给Qt程序设置默认皮肤:

QApplication a(argc, argv);
 a.setStyle("windowsxp");

还可设置为:"windows","motif","cde","motifplus","platinum","sgi"和"compact".根据平台,"windowsxp","aqua"或"macintosh"也是可以用的。

Qt中计算一段程序的运行时间:

#include <QTime>

QTime tmpTime;

tmpTime.start();

qDebug() << tmpTime.elapsed() << "ms";

QT GUI总结的更多相关文章

  1. 保持Qt GUI响应的几种方法

    最开始使用Qt时就遇到过QT Gui失去响应的问题,我是用多线程的方式解决的,然而通常来说,多线程是会降低程序的运行速度. 之后,在使用QSqlQuery::execBatch()函数时,Qt Gui ...

  2. 第八章 Qt GUI之对话框使用

    第八章 Qt GUI之对话框使用 对话框可以是模态(modal)的或非模态(modeless)两种.当我们在一个用户界面程序里面对一个对话框(比如选择文件对话框)的操作没有结束前,界面的其他窗口无法操 ...

  3. 自己的Qt GUI 项目+vs2013+opencv+caffe环境配置

    由于深度学习的种种优势,使我们对于深度学习的使用越来越频繁.很多时候,我们都需要在自己的项目中配置caffe环境,来调用caffe网络模型完成自己的任务.今天我主要讲的关于"在自己的项目中配 ...

  4. GNU Radio下QT GUI Tab Widget的使用方法

    期望显示出的效果: 即将要显示的图放在各自的标签页中. 整体框图: 具体设置: QT GUI Tab Widget的设置: 其中 ID改为自己想改的,这里我写的是display GUI Hint所代表 ...

  5. QT GUI @创建新的工程

    开发环境: Qt 4.5 Qt Creator 1.3.0 新工程创建步骤: 1. 单击运行Qt Creator,进入欢迎页面.选择"File" -> "New F ...

  6. 独立线程中实现QT GUI

    在网上搜集的资料: http://www.qtcentre.org/threads/16552-Starting-QT-GUI-in-a-seperate-Threadhttp://stackover ...

  7. 基于Qt Gui的Led控制显示程序

    基于arm + linux的嵌入式软件开发,基本上的内容主要是:u-boot的移植,kernel的裁剪和相关驱动程序的设计,root-fs的制作,应用程序的设计,其中,应用程序主要包含两方面的内容:G ...

  8. Qt GUI@学习日志

    day 1: Qt中类: 理解一个类最好还是从其类代码实现上看. 由此图可看出需要好好研究那几个重要的类:Qt/QEvent/QObject/QWidget/. QApplication: (比较复杂 ...

  9. 3.Qt GUI中一些操作记录

    一.如何在Widget中利用代码添加背景图片 this->setAutoFillBackground(true); // QPalette palette = this->palette( ...

随机推荐

  1. 【转】深入 char * ,char ** ,char a[ ] ,char *a[] 内核

    原文出处:http://blog.csdn.net/daiyutage/article/details/8604720    C语言中由于指针的灵活性,导致指针能代替数组使用,或者混合使用,这些导致了 ...

  2. [python]文本处理1.2

    1.0初步完成了文本截取需要信息的处理 1.1 修复了格式所造成的遗漏字符 1.2 去除了遗漏字符中的多余字符 bug-文本test14 有遗漏字符 bug-修复的遗漏字符中含有\n 未被识别为换行符

  3. 在IT学习中的“认识论”

    先有“感性认识”,再有“理性认识”.这句经典认识论,在IT领域应用广泛. 一个项目,首先是分析需求,也就是功能层面,这相当于先有“感性认识”:然后才是具体的技术实现,也就是“理性认识”. IT学习分析 ...

  4. EF自动生成的(T4模板) 关联属性元数据修改

    为了实现 T4模板关联属性 不要序列化的问题 就是要在具体的 关联属性上面添加一个元数据 这里利用以前的 Newtonsoft.Json 这个框架为例 效果应该为 就是要在关联属性上面添加元数据  [ ...

  5. 【BZOJ2434-[Noi2011]】阿狸的打字机(AC自动机(fail树)+离线+树状数组)

    Description 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机.打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母. 经阿狸研究发现,这个打字机是这样工作的 ...

  6. HTML+js+css实现点击图片弹出上传文件窗口的两种思路

    第一种:CSS实现 <style><!-- .fileInputContainer{        height:256px;        background:url(upfil ...

  7. tomcat 系统架构与设计模式 第二部分 设计模式 转

    Tomcat 系统架构与设计模式,第 2 部分: 设计模式分析 许 令波, Java 开发工程师, 淘宝网 许令波,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,并对一些 ...

  8. tomcat修改默认web目录

    有两种方法: 1.tomcat目录下的conf文件夹, server.xml <Context path="" docBase="d:\myapp" de ...

  9. nginx -- handler模块(100%)

    handler模块简介 相信大家在看了前一章的模块概述以后,都对nginx的模块有了一个基本的认识.基本上作为第三方开发者最可能开发的就是三种类型的模块,即handler,filter和load-ba ...

  10. extjs+Aspose.Cells导出到Excel

    1.&=DataSource.Field,&=[DataSource].[Field]是对DataTable和几何类型的引用,将会从当前行开始竖直向下生成多行数据. 2.&=$ ...