QT基础学习笔记

Qt简介:
1991,
挪威奇趣科技Trolltech开发的跨平台c++图形用户界面(GUI)应用程序开发。
2008,被诺基亚收购
2012,转让给芬兰的Digia公司。

商业版:专业版,企业版; // 开源版(GNU)

优势:
1.跨平台 2.面向对象 3.丰富API 类库  4.可视化编程 5,时间驱动机制

JAVA--compile once, run anywhere    一次编译,到处运行
Qt-- wrire
once ,comile anywhere     一次编写,到处编译

桌面操作系统:Windows,   Mac OS X,   Linux/Unix
X11
嵌入式操作系统:Windows CE, Sybian ,Meego,Embedded Linux

Qt 组成
QtSDK 4.7
 qmake编译器  moc 元对象编译器   uic
界面UI编译器   rcc 资源编译器   irelease/lupdata 翻译器 

Development Tools:
 QtCreator 2.4 跨平台轻量级IDE
 Qt
Designer  拖拽式界面设计器
 Qt Linguist 预言家,翻译
 Qt Assistant
Qt助手 帮助系统。

标准c++编译:.h+  .cpp ->.o -->.exe

元对象编译moc(meta-objects-compile):      
.h+.cpp->.o ->
exe
              
meta-objects source files

Qt 编译 project sources +meta-objects+ ui:   .ui->.h+.cpp->.o
->
exe
                      
meta-objects source files

QT类库模块:
1.QtCore:Qt内核,IO,线程,容器类,IPC类
2.QtGui

3.QtOpenGl
4.QtNetwork
5.QtSql
6.Phonon
7.QtWebkit
8.QtXml

窗体基类:
1.QWidget:窗体基类
2.QMainWindow:主窗体基类(菜单 工具 工作区域
状态栏),继承于QWidget
3.QDialog:对话窗体基类,继承于QWidget

QObject 是qt绝大部分类的基类,一定是所有QWidget类的基类,包含:信号 槽  事件 属性 内存管理

Q_OBJECT:宏变量,使用moc(meta object
compile原子对象编译),主要使用在信号与槽机制,必须写在类定义的最前面,而且必须是QObject的派生类

qt全局指针变量
qApp:A global pointer referring to the unique application object
指向应用程序对象的全局指针

qt全局命名空间
Qt:The Qt namespace contains miscellaneous identifiers used
throughout the Qt library
包含QT枚举变量定义的命名空间

qt窗体关闭与系统推出关系:
1.关闭窗体 close
2.退出系统
quit
3.如果只打开一个窗体,关闭窗体同时也退出系统

Qt编程结构:
工程:.project

QT       += core gui

TARGET = qthello
TEMPLATE = app

头文件:HEADERS     .h
源文件:SOURCES:   
.cpp
界面文件:FORMS     .ui 
(会编译为头文件.h)
资源: RESOURCE  .qrc

解决不能执行双击QT执行文件的问题:
1.修改环境变量path
2.path=path+C:\QtSDK\Desktop\Qt\4.8.1\mingw\bin

window平台下QT编译与链接命令
qmake
mingw

window cmd控制编译QT程序:(运行会出错)
1.qmake --project //生成工程文件
2.qmake
-makefile  //生成makefile文件
3.mingw32-make    
//链接生成exe文件
4.xx.exe

一。简单窗口 Widget

widget.h //自定义窗口类的声明

#ifndef WIDGET_H
#define WIDGET_H

#include <QtGui/QWidget>
#include <QtGui> 
//包含所有窗体部件类
/*#include <QPushButton>
#include
<QLineEdit>*/

class Widget : public QWidget
{
    Q_OBJECT 
//宏变量,使用原子对象编译moc所需要的标记。
   
public:
   
Widget(QWidget *parent = 0);
    ~Widget();
signals:
//定义信号

public slots: //定义槽
    void setEditText();

private:
    QPushButton *btn; //按钮对象
   
QLineEdit *edit;  //定义单行文本对象
};

#endif // WIDGET_H

widget.cpp    //自定义窗体类成员函数的实现

#include "widget.h"

Widget::Widget(QWidget *parent)   //构造
    :
QWidget(parent)
{
 btn=new
QPushButton(tr("按钮"),this);
     
btn->setGeometry(100,100,30,20);//设置按钮,宽高度

edit=new QLineEdit(this);
     
edit->setGeometry(50,50,200,20);

//链接信号与槽机制
    
//SIGNAL:信号宏变量
     //SLOT:槽宏变量
   
connect(btn,SIGNAL(clicked()),this,SLOT(setEditText()));
}

Widget::~Widget()   //析构
{
   
}

void Widget::setEditText()
{
   
edit->setText("abcd"); //单行文本赋值
  
}

main.cpp//主函数实现

#include <QtGui/QApplication>
#include "widget.h"
#include
<QTextCodec> //字符集类

int main(int argc, char *argv[])
{
    QApplication
a(argc, argv); //应用程序类,主要是用来管理GUI应用程序
   
//设置qt对于中文使用字符集(从本地机器获取)
    //tr:国际化函数
   
QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
   
Widget w; //定义窗体对象
    w.show(); 
//显示窗口
   
    return a.exec(); 
//让应用程序进入事件循环机制,响应执行用户事件(死循环)
}

qt信号与槽机制

信号与槽:实现原子对象对象之间通信
信号与槽使用的对象必须为QObject派生类,类中必须包含宏变量Q_OBJECT

什么是信号:
是一个无返回值不需要实现,没有访问权限限制(private public
protected)的类的成员的函数
利用signals:关键说明
信号使用emit 发送信号

什么是槽:
槽是一个无返回值的成员函数,必须要实现函数

利用 connect实现信号与槽连接
connect(发送对象,SINGAL(信号),接收对象,SLOT(接收对象要执行动作))

信号与槽与注意事项
1.信号与槽不需要返回
2.信号不能直接调用,必须要emit函数发送,槽是可以当做一般函数调用
3.信号可以传递(信号自己不能发送给自己)
4.一个信号可以发送给多个接收对象(执行多个槽),但是槽执行的顺序是不确定
5.信号与槽可以有参数,参数不能是指针
 
参数不能有默认值
  参数不能使模板类型

//自定义信号:
signals:
 void signal1();
 void signal2(QString
str);
 void signal3(int a,int b);
//自定义槽(必须要说明访问权限)
public
slots:
      void
receiversignal1();
      void
receiversignal2(QString str);
      void
receiversignal3(int a);

//连接信号与槽
connect(this,SIGNAL(signal1()),this,SLOT(receiversignal1()));
//发送对象与接收对象为同一个对象
connect(this,SIGNAL(signal2(QString)),SLOT(receiversignal2(QString)));
//接收对象的槽只能接收大于或等于槽参数个数的信号
connect(this,SIGNAL(signal2(QString)),SLOT(receiversignal1()));
//信号与槽参数个数可以不相等,但是对应参数数据类型要匹配
connect(this,SIGNAL(signal3(int,int)),SLOT(receiversignal3(int)));

//发送信号
emit signal1();
//发送有参数信号
emit 
signal2("abc");
emit signal3(20,200);

事件QEvent
#include <QEvent>

事件是结合操作系统消息响应,能够让应用程序进入到操作系统的消息队列,可以通过捕捉用户的针对桌面程序动作,实现具体功能

qt事件的基类QEVENT
常见的事件:鼠标事件  键盘事件  关闭事件  绘画事件

如何实现事件:
1.创建对象的派生类,重写具体事件函数
2.在类中重写Event函数
3.利用事件过滤器

class QLineText : public QLineEdit
{
   
//重写失去焦点和获得焦点事件
    //QFocusEvent * e:保存关于焦点事件的相关属性
函数等
    void focusInEvent(QFocusEvent *
e);
    void focusOutEvent(QFocusEvent * e);
};

鼠标事件
#include <QMouseEvent>

void mousePressEvent(QMouseEvent *e);
void mouseMoveEvent(QMouseEvent
*e);
void mouseDoubleClickEvent(QMouseEvent *e);
void
mouseReleaseEvent(QMouseEvent *e);

setMouseTracking(true);

void Widget::mousePressEvent(QMouseEvent *e)
{
   
//this->ui->textEdit->append("mouse pressed");
   
if(e->button()==Qt::LeftButton)
   
{
       
this->ui->textEdit->append("left button
pressed");
       
this->setCursor(Qt::PointingHandCursor);
       
//改变光标图形
        //QCursor
cur(QPixmap(":images/1.png"));
       
//QApplication::setOverrideCursor(cur);
    }

if(e->button()==Qt::RightButton)
   
{
       
this->ui->textEdit->append("right button
pressed");
    }
}

void Widget::mouseMoveEvent(QMouseEvent *e)
{
   
//QString
str=tr("x=%1,y=%2").arg(e->pos().x()).arg(e->pos().y());
   
if(e->buttons()&Qt::LeftButton)
   
{
      QString
str=tr("x=%1,y=%2").arg(e->globalPos().x()).arg(e->globalPos().y());
   
this->ui->textEdit->append(str);
   
this->ui->label->move(e->pos().x(),e->pos().y());
   
}
}

void Widget::mouseDoubleClickEvent(QMouseEvent *e)
{
   
if(e->button()==Qt::LeftButton)
   
{
       
this->ui->textEdit->append(tr("double lef key"));
   
}

if(e->button()==Qt::RightButton)
   
{
       
this->ui->textEdit->append(tr("double right
key"));
    }
}

void Widget::mouseReleaseEvent(QMouseEvent *e)
{
   
this->setCursor(Qt::ArrowCursor);
}

键盘事件
#include <QKeyEvent>

void keyPressEvent(QKeyEvent *e);
void keyReleaseEvent(QKeyEvent *e);

void Widget::keyPressEvent(QKeyEvent *e)
{
   
if(e->key()==Qt::Key_A)
   
{
       
this->ui->textEdit->setText("A");
   
}
    if(e->key()==Qt::Key_0)
   
{
       
this->ui->textEdit->setText("0");
    }

if(e->key()==Qt::Key_F3)
   
{
       
this->ui->textEdit->setText("F3");
   
}
    if(e->key()==Qt::Key_Shift)
   
{
        
this->ui->textEdit->setText("shift");
   
}
    if(e->key()==Qt::Key_Return)
   
{
        
this->ui->textEdit->setText("enter");
   
}
    if(e->key()==Qt::Key_Escape)
   
{
        
this->ui->textEdit->setText("Esc");
   
}
    if(e->key()==Qt::Key_Up)
   
{
       
this->ui->textEdit->setText("Up");
   
}
    if(e->modifiers()==Qt::ShiftModifier &&
e->key()==Qt::Key_A)
   
{
      
this->ui->textEdit->setText("shif+A");
    }
}

void Widget::keyReleaseEvent(QKeyEvent *e)
{
}

关闭事件
#include <QCloseEvent>

void closeEvent(QCloseEvent * e);

void Widget::closeEvent(QCloseEvent *e)
{
   
QMessageBox::StandardButton
btn=QMessageBox::question(this,"question",tr("是否关闭?"),QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
   
if(btn==QMessageBox::Yes)
   
{
       
e->accept();
    }
   
if(btn==QMessageBox::No)
   
{
       
e->ignore();
    }
}

右键菜单

#include <QContextMenuEvent>

void contextMenuEvent(QContextMenuEvent * e);

void Widget::contextMenuEvent(QContextMenuEvent
*e)
{
    QAction *ac1=new
QAction(tr("菜单1"),this);
   
connect(ac1,SIGNAL(triggered()),this,SLOT(cdslot()));
   
QMenu *menu=new QMenu;
   
menu->addAction(ac1);
   
menu->exec(e->globalPos());
}

//重写一个event方法实现所有事件功能

protected:
    bool event(QEvent *e);

bool Widget::event(QEvent *e)
{
   
//判断事件类型
   
if(e->type()==QEvent::MouseMove)
   
{
       
//将基类转换成派生类
        QMouseEvent
*me=static_cast<QMouseEvent*>(e);
      
et1->append(tr("x=%1;y=%2").arg(me->pos().x()).arg(me->pos().y()));
   
return true;
    }
   
if(e->type()==QEvent::MouseButtonDblClick)
   
{
        QMouseEvent *
me=dynamic_cast<QMouseEvent*>(e);
       
if(me->button()==Qt::LeftButton)
       
{
           
et1->append(tr("left button
press"));
        return 
true;
        }
   
}
    if(e->type()==QEvent::KeyPress)
   
{
        QKeyEvent
*ke=static_cast<QKeyEvent*>(e);
       
if(ke->key()==Qt::Key_A)
       
{
          
et1->append(tr("A"));
        return
true;
        }
   
}

if(e->type()==QEvent::Close)
   
{
        QCloseEvent
*ce=static_cast<QCloseEvent*>(e);
      
// e->ignore();
       
e->accept();
     return true;
   
}
    //如果派生类没有完成事件,基类完成
    return
QWidget::event(e);
}

事件过滤器

监控所有对象可能发生的事件

事件过滤器使用的步骤:
1.重写eventFilter 方法
2.在构造函数中注册每个部件到事件过滤器

protected:
    bool eventFilter(QObject * obj, QEvent *
e);
 //obj:标记事件发生对象
      // e:标记事件

//注册部件到事件过滤器
this->ui->textEdit->installEventFilter(this);
this->ui->textEdit_2->installEventFilter(this);
this->installEventFilter(this);

bool Widget::eventFilter(QObject *obj, QEvent
*e)
{
   
if(obj==this->ui->textEdit)
   
{
       
if(e->type()==QEvent::FocusIn)
       
{
           
this->ui->textEdit->setText("in");
           
return true;
        }

if(e->type()==QEvent::FocusOut)
       
{
           
this->ui->textEdit->setText("out");
           
return true;
       
}
    }

if(obj==this->ui->textEdit_2)
   
{
       
if(e->type()==QEvent::FocusIn)
       
{
           
this->ui->textEdit_2->setText("in");
           
return true;
        }

if(e->type()==QEvent::FocusOut)
       
{
           
this->ui->textEdit_2->setText("out");
           
return true;
       
}
    }

if(obj==this)
   
{
       
if(e->type()==QEvent::MouseButtonDblClick)
       
{
           
this->ui->textEdit->setText("double
press");
           
return true;
       
}
    }
    return
QWidget::eventFilter(obj,e);
}

QT基础学习笔记

时间: 2024-10-12 22:54:38

QT基础学习笔记的相关文章

linux系统构建基础学习笔记——操作

linux系统构建 ********************************************************                  ---交叉编译环境构建--- 安装arm-linux-gcc-4.3.2 (交叉编译器) tar xzvf arm-linux-gcc-4.3.2.tgz -C /cd /usr/local/arm/4.3.2/bin./arm-linux-gcc -v在/etc/bashrc文件的最后添加如下一行:   export PATH=

HTML&CSS基础学习笔记8-预格式文本

<pre>标签的主要作用是预格式化文本.被包围在 pre 标签中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>标签的一个常见应用就是用来表示计算机的源代码.当然你也可以在你需要在网页中预显示格式时使用它. 会使你的文本换行的标签(例如<h>.<p>)绝不能包含在 <pre> 所定义的块里.尽管有些浏览器会把段落结束标签解释为简单地换行,但是这种行为在所有浏览器上并不都是一样的. 更多学习内容,就在码芽网http://www.

HTML&CSS基础学习笔记13—无序列表

无序列表 有时我们的工作繁忙,杂事很多,怕忘记,就会把事情一件件列出来,防止忘记. 它们的排列顺序对于我们来说并不重要,可以随意调换,我们将它称为无序列表,HTML里用<ul>标签来表示无序列表,列表里的项目则用<li>标签来表示: 1 2 3 4 5 <ul>     <li></li>     <li></li>     ... </ul> 看一段实例代码: 对于的浏览器显示结果是这样的: 更多内容学习,请

ASP.Net MVC开发基础学习笔记(3):Razor视图引擎、控制器与路由机制学习

首页 头条 文章 频道                         设计频道 Web前端 Python开发 Java技术 Android应用 iOS应用 资源 小组 相亲 频道 首页 头条 文章 小组 相亲 资源 设计 前端 Python Java 安卓 iOS 登录 注册 首页 最新文章 经典回顾 开发 Web前端 Python Android iOS Java C/C++ PHP .NET Ruby Go 设计 UI设计 网页设计 交互设计 用户体验 设计教程 设计职场 极客 IT技术

JAVA基础学习笔记(2)

看了几天的视频了,都没时间来写下学习笔记,今天来写下第二次的学习笔记,前几天看的给忘记了,就写最新看到的吧 主要内容:1.类的变量与函数(方法) 2.对象的存储方式 3.新建一个对象及对象的赋值与调用 4.空对象 5.匿名对象 1.类的变量与函数(方法) class Dog      //类名 { String name;  //变量的声明 int age; String color; void bark()   //方法的定义(返回值为空,不带参数) { System.out.println(

ASP.Net MVC开发基础学习笔记:三、Razor视图引擎、控制器与路由机制学习

一.天降神器“剃须刀” — Razor视图引擎 1.1 千呼万唤始出来的MVC3.0 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASPX引擎或者第三方的NVelocity模板引擎. Razor在减少代码冗余.增强代码可读性和Visual Studio智能感知方面,都有着突出的优势.Razor一经推出就深受广大ASP.Net开发者的喜爱. 1.2 Razor的语法 (1)Razor文件类型:Razor支持两种文件类型,分

JAVA基础学习笔记(1)

今天第一天开始学JAVA,时间:2014年6月17日 学习内容:1.java环境的架设 2.JAVA基本数据类型 1.JAVA环境的架设       1.要先去下载JDK,下载地址 2.安装完成后,设置环境变量 1.1环境变量的设置        1.右键-我的电脑-属性-高级-环境变量-系统变量,找到PATH,在里面加入jdk里bin目录的地址 如:c:\java\bin; 2.新建-名为classpath,值为. 1.2测试JAVA是否配置正确        1.在cmd里面输入javac.

java基础学习笔记day01

java基础学习笔记day01 1.软件开发: 软件:按照特定顺序组织的计算机数据和指令的集合 开发:软件的制作过程 软件开发:借助开发工具和计算机语言制作软件 2.java概述: java之父:詹姆斯·高斯林 JDK:java开发环境 jre:java运行环境 JVM:java虚拟机 java跨平台是因为,JVM能在不同的平台运行,JVM是跨平台的 JavaSE:标准版 JavaME:手机端,物联网 JavaEE:企业版,互联网项目 3.java语言特点: 简单性 解释性 面向对象 高性能 分

linux基础学习笔记——操作大全

作者:liaoyi 更新时间:2014-6-2 ****************基本操作***************** 关机 shutdown -h now    root用户               init 0              root用户halt      root+一般用户poweroff 重启shutdown -r now    root用户init6     root用户reboot            root+一般用户 注意:1.shutdown 比较灵活,可