网站开发技术文档范例正规的ui设计培训学校
1.qt概述
1.什么是qt
         Qt 是一个跨平台的  C++ 图形用户界面应用程序框架。它为应用程序开发者提供建立艺  
 
 术级图形界面所需的所有功能。它是完全面向对象的,很容易扩展,并且允许真正的组  
 
 件编程。 
 
 
2.支持的平台
 Windows – XP 、 Vista 、 Win7 、 Win8 、 Win2008 、 Win10  
 
 Uinux/X11 – Linux 、 Sun Solaris 、 HP-UX 、 Compaq Tru64 UNIX 、 IBM AIX 、  
 
 SGI IRIX 、 FreeBSD 、 BSD/OS 、和其他很多  X11  平台  
 
 Macintosh – Mac OS X  
 
 Embedded –  有帧缓冲支持的嵌入式  Linux  平台, Windows CE 
 
 
3.安装 
 
见之前博客 
 
2.创建项目
创建项目
步骤一:选择新建

步骤二:选择application项目

3.填写项目名称和存储路径位置


如图所示
3.工程.pro文件说明
 #  添加源信息:  core 核心源码,  gui 图形化源码  
 
 QT + =  core gui  
 
 
 #  如果 Qt 版本大于 4, 没  QT 添加  widgets 组件库  
 
 greaterThan(QT_MAJOR_VERSION, 4) :  QT + =  widgets  
 
 
 # 生成的 .exe 文件名  
 
 TARGET  =  demo01  
 
 
 # 模板类型 ,app 表示应用程序模板  
 
 TEMPLATE  =  app  
 
 
 #  使用  c++11  标准  
 
 # g++ -std=c++11  
 
 CONFIG + =  c++11  
 
 
 # Qt  过时警告  
 
 DEFINES + =  QT_DEPRECATED_WARNINGS  
 
 
 # cpp 的源文件 【重要】  
 
 SOURCES + =  \  
 
 main.cpp \  
 
 widget.cpp  
 
 
 #  头文件 【重要】  
 
 HEADERS + =  \  
 
 widget.h  
 
 
 #  编译时输出的可执行程序的名称  
 
 TARGET  =  hello  
 
 
 #  部署安装时的选项, qnx 是嵌入式的操作系统的名称  
 
 qnx :  target.path  =  /tmp/$${TARGET}/bin  
 
 
 #  如果不是 qnx ,是 unix 非 Android 时 , 安装的目标位置是  /opt/../bin  
 
 else :  unix : !android :  target.path  =  /opt/$${TARGET}/bin 
 
 
 #  如果 target.path 路径非空时,则设置安装路径  
  !isEmpty(target.path): INSTALLS += target 
 
4.窗口属性
 this->resize(800,600);  //设置窗口大小( 1 参 : 宽度, 2 参 : 高度) 
 
 
 this->setWindowTitle(" 德玛西亚"); // 设置窗口标题 
 
 
 this->setFixedSize(800,600);// 设置窗口大小不可改变 
 
 
this->setWindowicon(Qicon("图片文件路径"));//设置窗口图标 
 
 
this->setText("");//设置文本信息 
 
 
this->Text();//获取文本信息 
 
5.按钮Qpushbutton
方式一:代码创建
#include "widget.h"
#include "ui_widget.h"
#include <QPushButton>//1,引入按钮所需头文件
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{ui->setupUi(this);//设置窗口大小//1参:宽度//2参:高度this->resize(800,600);//设置窗口标题this->setWindowTitle("德玛西亚");//设置窗口大小不可改变this->setFixedSize(800,600);//2,创建按钮对象QPushButton* btn = new QPushButton;//3,设置按钮的父容器btn->setParent(this);//4,设置位置btn->move(100,100);//5,设置文本btn->setText("登录");}
Widget::~Widget()
{delete ui;
} 
 方式 2: 图形界面开发 
 
 
 
6.信号与槽机制
1.注意
         核心在于发送者与接受者  
 
         发送者可以发出多种信号, 被多个不同的接收者接收  
 
         接收者有多个槽函数, 接收不同的发送者发出的信号 
 
2.信号与槽的连接
connect()函数 
 
 
         connect(sender, signal, receiver, slot)  
          sender:发送者  
          signal:发出的信号  
          receiver:接受者  
          slot:槽函数 
 示例1 
          //ui文件中名为 btnclose 的按钮发出点击信号  
          //被当前窗口接收,执行关闭窗口的操作  
          //qt5的写法  
          //connect(ui->btnclose,&QPushButton::clicked,this,&Widget::close);  
           //qt4的写法  
          connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(close()));  
            示例2 
          //信号与槽函数有参数  
          //qt5的写法  
          //void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;  
          //void (Widget:: *myfun_p)(bool) = &Widget::myfun;  
          //connect(ui->btnclose,cli_p,this,myfun_p);  
           //qt4的写法  
          connect(ui->btnclose,SIGNAL(clicked(bool)),this,SLOT(myfun(bool))); 
 系统提供的信号与槽
 QWidget 提供 
  信号: 
  void customContextMenuRequested(const QPoint &pos) // 请求上下文菜单时  
  void windowIconChanged(const QIcon &icon) // 窗口图标改变时  
  void windowTitleChanged(const QString &title) // 窗口标题改变时  
  槽: 
  bool close() //  关闭  
  void hide() //  隐藏  
  void lower()  
  void raise()  
  void repaint() //  重新加载  
  void setDisabled(bool disable)  
  void setEnabled(bool)  
  void setFocus()  
  void setHidden(bool hidden)  
  void setStyleSheet(const QString &styleSheet)  
  virtual void setVisible(bool visible)  
  void setWindowModified(bool)  
  void setWindowTitle(const QString &)  
  void show() //  显示  
  void showFullScreen() //  全屏显示  
  void showMaximized() //  最大化显示  
  void showMinimized() //  最小化显示  
  void showNormal()  
  void update() 
   QPushButton 提供 
 信号: 
  void clicked(bool checked = false) // 点击信号  
  void pressed() // 按钮按下信号 (按下)  
  void released() // 按钮释放信号(抬起)  
  void toggled(bool checked) // 触发(开或关) 
 自定义信号与槽
注意事项:
 1, 发送者和接收者都需要是 QObject 的子类(当然,槽函数是全局函数、 Lambda  表达  
  式等无需接收者的时候除外)  
  2, 信号和槽函数返回值类型是  void  
  3, 信号只需要声明 , 不需要实现  
  4, 槽函数需要声明也需要实现  
  5, 槽函数是普通的成员函数,作为成员函数,会受到  public 、 private 、 protected  
  的影响;  
  6, 使用  emit  在恰当的位置发送信号 ;  
  7, 使用 connect() 函数连接信号和槽。  
  8, 任何成员函数、 static  函数、全局函数和  Lambda  表达式都可以作为槽函数  
  9, 信号槽要求信号和槽的参数一致,所谓一致,是参数类型一致。  
  10, 如果信号和槽的参数不一致,允许的情况是,槽函数的参数可以比信号的少,即便  
  如此,槽函数存在的那些参数的顺序也必须和信号的前面几个一致起来。这是因为,你  
  可以在槽函数中选择忽略信号传来的数据(也就是槽函数的参数比信号的少)。 
   案例 : 下课了 , 老师饿了 , 学生请吃饭 
 
 
 信号槽拓展
1,一个信号可以和多个槽相连
         槽会一个接一个的被调用,但是它们的调用顺序是不确定 
 示例: 
 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("按钮");void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn,cli_p,this,&MainWindow::fun01);connect(btn,cli_p,this,&MainWindow::fun02);connect(btn,cli_p,this,&MainWindow::fun03);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
}
void MainWindow::fun02()
{qDebug() << "fun0222222" << endl;
}
void MainWindow::fun03()
{qDebug() << "fun0333333" << endl;
} 2,多个信号可以连接到一个槽
         只要任意一个信号发出,这个槽就会被调用 
  示例: 
 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn1 = new QPushButton(this);btn1->setText("按钮1");QPushButton* btn2 = new QPushButton(this);btn2->setText("按钮2");btn2->move(0,50);void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn1,cli_p,this,&MainWindow::fun01);connect(btn2,cli_p,this,&MainWindow::fun01);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
} 3,一个信号可以连接到另外的一个信号
         当第一个信号发出时,第二个信号被发出。除此之外,这种信号- 信号的形式和信号 - 槽  
  的形式没有什么区别。 
  示例:   
 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("按钮");void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn,cli_p,this,&MainWindow::mySignal);connect(this,&MainWindow::mySignal,this,&MainWindow::fun01);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
} 4,信号槽可以断开
         利用 disconnect  关键字是可以断开信号槽的 
 示例:               
 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{ui->setupUi(this);QPushButton* btn = new QPushButton(this);btn->setText("按钮");void (QPushButton:: *cli_p)(bool) = &QPushButton::clicked;connect(btn,cli_p,this,&MainWindow::fun01);//断开信号与槽的连接btn->disconnect(this);
}
MainWindow::~MainWindow()
{delete ui;
}
void MainWindow::fun01()
{qDebug() << "fun0111111" << endl;
} 5,槽可以被取消链接
         这种情况并不经常出现,因为当一个对象 delete  之后, Qt  自动取消所有连接到这个  
  对象上面的槽  
  6.使用lambda表达式
         在使用 Qt 5  的时候,能够支持  Qt 5  的编译器都是支持  Lambda  表达式的。  
 Lambda表达式
 c++11 提出 lambda 表达式  
  作用 : 简化代码 
   语法: 
  [ 函数对象参数 ]( 操作符重载函数参数 ) mutable -> 返回值 { 函数体 }  
          []:lambda表达式符号 , 可以啥都不写 , 不能省略 
          函数对象参数  
                  空 没有使用任何函数对象参数  
                  = 可以访问外部变量只能读  
                  a,b 能对lambda 外的 a,b 变量读操作  
                  & lambda外的变量读写操作  
                  a,&b 对外部的a 读  b 读写  
                  this 函数体内可以使用 Lambda  所在类中的成员变量  
  (): 形参列表 
  示例1:不使用外部变量
 connect(btn03,&QPushButton::clicked,[](){  
  qDebug()<< " 疼 , 不闹 " << endl;  
  }); 
  示例2.使用外部指定变量
 int x=100;  
  connect(btn2, &QPushButton::clicked, [x]() mutable{  
  // x  在函数内部是  const 修饰的,除非去掉 const ,加 mutable 关键字  
  x++;  
  qDebug() << x << endl;  
  }); 
  示例3:同时传递多个变量或变量的引用
 int x=100;  
  int y=90;  
  connect(btn2, &QPushButton::clicked, [x, &y]() mutable{  
  // x  在函数内部是  const 修饰的,除非去掉 const ,加 mutable 关键字  
  x++;  
  qDebug() << x <<","<< y << endl;  
  }); 
  



