c++之QT的使用

Qt5.12下载网址: http://download.qt.io/archive/qt/5.12/5.12.2/

父类QWidget:子类QmainWindow和Qdialog;

QWidget类是所有用户界面对象的基类。 窗口部件是用户界面的一个基本单元:它从窗口系统接收鼠标、键盘和
其它事件,并且在屏幕上绘制自己。每一个窗口部件都是矩形的,并且它们按Z轴顺序排列。一个窗口部件可以被
它的父窗口部件或者它前面的窗口部件盖住一部分。 


    QMainWindow 类提供一个有菜单条、锚接窗口(例如工具条)和一个状态条的主应用程序窗口。主窗口通常
用在提供一个大的中央窗口部件(例如文本编辑或者绘制画布)以及周围 菜单、工具条和一个状态条。
QMainWindow常常被继承,因为这使得封装中央部件、菜单和工具条以及窗口状态条变得更容易,当用户点击菜单
项或者工具条按钮时,槽会被调用。


    QDialog类是对话框窗口的基类。对话框窗口是主要用于短期任务以及和用户进行简要通讯的顶级窗口。
QDialog可以是模态对话框也可以是非模态对话框。QDialog支持扩展性并且可以提供返回值。它们可以有默认按
钮。QDialog也可以有一个QSizeGrip在它的右下角,使用setSizeGripEnabled()。 


    QDialog 是最普通的顶级窗口。一个不会被嵌入到父窗口部件的窗口部件叫做顶级窗口部件。通常情况下,
顶级窗口部件是有框架和标题栏的窗口(尽管使用了一定的窗口部件标记,创建顶级窗口部件时也可能没有这些装
饰。)在Qt中,QMainWindow和不同的QDialog的子类是最普通的顶级窗口。


    如果是顶级对话框,那就基于QDialog创建,如果是主窗体,那就基于QMainWindow,如果不确定,或者有可
能作为顶级窗体,或有可能嵌入到其他窗体中,则基于QWidget创建。

需要添加编译套件Kits,也就是添加编译器;

快捷键:

注释:ctrl+/

运行:ctrl+r;

编译:ctrl+b,

字体缩放:ctrl+鼠标滚轮;

查找:ctrl+f;

整行移动:ctrl+shit+上下键;

帮助文档:F1;

自动对齐:ctrl+i;

同名的.h和.cpp切换:F4;

 

 

Qapplication:应用 程序对象,有且只有一个;

return a.exec();让应用程序对象进入消息循环机制中,代码阻塞到当前;

setWindowIcon(QIcon(":/"));

show方法:是以顶层方式弹出窗口控件;

resize(w,h)重置窗口大小;

move(x,y);移动控件位置

setWindowTitle("");设置窗口标题

setFixedSize(200,200);设置固定窗口大小;

setParent(父类);把当前控件添加到父类中;

setText(“”);设置文本

btn->resize();重置按钮大小;

 

对象树:

只要在对象树中,只要窗口释放了,对象树中的对象都会被释放,析构函数的顺序是从最下层的到最上层的;

当创建的对象在堆区的时候,如果对象是QObject的子类或者后代,可以不用管理释放操作,会被加到对象树中,自动的释放;

尽量在构造的时候指定parent对象,然后就放心的在堆上创建对象;

QT坐标系:(0,0)在左上角;x向右增加,y向下增加;

 

信号和槽:

connect(信号发送者,发送的具体信号,信号接收者,信号处理即槽函数);

connect(btn,&QPushbutton::clicked,this,&QWidget::close);

信号槽的优点,松散耦合,信号发送端和信号接收端本身没有联系,用槽来链接他们之间关系;

自定义信号:用emit触发自定义信号;

signals:
    //自定义信号,无返回值,只需要声明,不需要实现,可以有参数,可以重载;
    void hungry();

自定义槽:

public slots:
    //自定义槽函数
     //返回值void,需要声明,需要实现,可以有参数,可以重载;
    void treat();
在.cpp中  void Student::treat(){
   
    qDebug()<<"请老师吃饭";
}

连接和触发:

void Widget::afterclass(){
   
    qDebug()<<"下课后";
    //触发老师hungry的信号
    emit zt->hungry();
}
this->zt=new Teacher(this);
    this->st=new Student(this);
    connect(zt,&Teacher::hungry,st,&Student::treat);
    //需要先建立上面的链接,然后再下面的触发;
    afterclass();

 

 

当信号发生重载的时候,利用函数指针指向函数地址;

emit zt->hungry(“吃汉堡”);

 

函数指针->函数地址

void(Teacher :: * teachSignal)(QString)= emit zt->hungry();

void(Teacher :: * studentSlot(QString)= emit zt->hungry();

connect(zt,teachSignal,st,studentSlot);

 

Qstring转成char*:Qstring.toUtf8().data();

 

信号连接信号:一个信号触发另一个信号,另一个信号触发了相应的槽函数;

connect(zt,teachSignal,st,信号2);

断开信号:disconnect(zt,teachSignal,st,studentSlot);

一个信号可以连接多个槽函数;

多个信号连接同一个槽;

信号和槽的参数类型必须一一对应;

信号的参数可以多余槽的参数;

 

Lambda表达式:用于定义并创建匿名的函数对象,

[]标识符:=值传递;&引用传递;this相当于=;a按照a的方式区传递,其他都不识别;

[=](参数可有可无){

代码;

}();调用

 

按照值传递时,加上mutable可以修改值的拷贝,原来的值不变;

[a]()mutable{

代码;

}();

 

函数返回值:

int ret=

[]()-> int{

return 100;

}();

c++之QT的使用_第1张图片

QMainWindow:

包含:Window Title、MenuBar、Tool Bar Area、DockWidget Area、Central Widge、status Bar;

MenuBar菜单栏最多只能有一个;

  QMenuBar *bar=menuBar();//创建菜单栏
   setMenuBar(bar);//将菜单添加到窗口中

   QMenu *fileMenu=bar->addMenu("文件");//添加菜单
   fileMenu->addAction("新建");
   fileMenu->addSeparator();//分割线

解决在Mac上菜单栏不显示的问题:这是因为Mac上的菜单栏不在应用程序的顶部,而是在整个桌面的顶部。加上这句话后显示的是Windows上的样式。

设计师模式下(即UI模式下,本文这种模式)加入:ui->menuBar->setNativeMenuBar(false);
代码模式下(纯代码创建菜单栏模式):自己的类->setNativeMenuBar(false);

 

Tool Bar工具栏可以有多个;

   QToolBar *toolBar=new QToolBar(this);
   addToolBar(toolBar);
   addToolBar(Qt::LeftToolBarArea,toolBar);
   toolBar->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);//设置停靠范围
   toolBar->setFloatable(false);//设置不允许浮动
   toolBar->setMovable(false);//设置是否允许移动,这个是总开关,
   QMenu *fileMenu2=bar->addMenu("文件");//添加菜单
 QAction *ac=  fileMenu2->addAction("新建");
   toolBar->addAction(ac);//添加内容
   QPushButton *qbtn=new QPushButton("按钮",this);
   toolBar->addWidget(qbtn);//添加按钮

status Bar状态栏最多只能有一个;


   QStatusBar *stBar=statusBar();
   setStatusBar(stBar);//设置到窗口中
   QLabel *label=new QLabel("提示信息",this);
   stBar->addWidget(label);
   QLabel *label2=new QLabel("右侧提示信息",this);
   stBar->addPermanentWidget(label2);
   QDockWidget *dockWidget=new QDockWidget("浮动",this);//铆接部件(浮动窗口),可以有多个
   addDockWidget(Qt::BottomDockWidgetArea,dockWidget);
   dockWidget->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);//允许上下浮动
   QTextEdit *edit=new QTextEdit(this);
   setCentralWidget(edit);//设置中心部件

资源文件:创建一个.qrc的文件,然后设置前缀,添加文件,编译就到项目中了;

模态对话框弹出后不可以对其他窗口操作,非模态对话框弹出后仍可以对其他窗口进行操作;

//模态对话框,卡面创建的对象在栈区
  QDialog dlg(this);
  dlg.resize(200,200);
  dlg.exec();

  //非模态对话框,下面创建的对象在堆区
  QDialog *dlg2=new QDialog(this);
  dlg2->resize(200,200);
  dlg2->show();

消息对话框:

QMessageBox::critical(this,"critical","错误");//错误对话框
  QMessageBox::information(this,"info","信息");
//参数 父亲   标题   参数   提示内容   默认选择;返回值是QMessageBox::Save或者QMessageBox::Cancel
  QMessageBox::question(this,"ques","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Save);
QColor  color= QColorDialog::getColor(QColor(255,0,0));//颜色对话框
    QFileDialog::getOpenFileName(this,"打开文件","文件路径");//打开文件
QString str=QFileDialog::getOpenFileName(this,"打开文件","文件路径","(*.txt)");//只能打开txt,参数 父亲  标题   打开路径   过滤文件格式

字体对话框:

   bool flag;
  QFont font=  QFontDialog::getFont(&flag,QFont("花纹彩云",36));
    font.family();//字体
    font.pointSize();//大小
    font.bold();//是否加粗
    font.italic();//是否倾斜

mianwindow的相关属性:

geometry:窗体现在的大小,如果要固定窗体的大小,可以同时修改minimumszie和maximumsize;

sizePolicy:可以调整widget的大小和它所包含的大小一致;

默认窗体和控件之间有9px的间距;可以在layout属性中修改;

echomod:密码看不见;

QListwidget:列表

   //添加一行
     QListWidgetItem *item=new QListWidgetItem("锄禾日当午");
     ui->listWiget->addItem(item);
     item->setTextAlignment(Qt::AlignCenter);//设置居中
     
     //一次性添加多行
    QStringList list;
    list <<"锄禾日当午"<<"汗滴禾下土";
    ui->listWiget->addItems(list);

QTreeWidget:列表子菜单

 //设置头
    ui->treeWidget->setHeaderLabels(QStringList()<<"英雄"<<"介绍");
    QTreeWidgetItem *liItem=new QTreeWidgetItem(QStringList()<< "力量");
    QTreeWidgetItem *liItem2=new QTreeWidgetItem(QStringList()<< "敏捷");
    //加载顶层节点
    ui->treeWidget->addTopLevelItem(liItem);
     ui->treeWidget->addTopLevelItem(liItem2);
     //追加子节点
    QStringList hero;
    hero<<"相当的厉害";
    QTreeWidgetItem *item=new QTreeWidgetItem(hero);
    liItem->addChild(item);

QTableWidget:表格

ui->tableWidget->setColumnCount(2);//设置列数
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");//设置表头
ui->tableWidget->setRowCount(5);//设置行数
ui->tableWidget->setItem(0,0,new QTableWidgetItem("lambo"));//设置第0行0列的内容

QStringList等价于QList;

int转QString:QString::number(11);

 

ToolBox:类似于QQ列表;

Tab Widget:类似于顶部导航;

stack Widget:方便切换不同模块; ui->stackedWidget->setCurrentIndex(1);

frame:边框;一般用来布局;

widget:一般用于布局;包含其他小控件;

combox:下拉框

ui->comboBox->addItem("奔驰");
     ui->comboBox->addItem("宝马");
      ui->comboBox->addItem("奥迪");
      
      //设置当前选中的项
      ui->comboBox->setCurrentText("奔驰");
      ui->comboBox->setCurrentIndex(0);

plain Text Edit:纯文本;

Text Edit:支持字体样式;

QLabel显示文本,也可以显示图片 :   ui->label->setPixmap((QPixmap(":/weixin.png")));
QLabel也可以显示动图;
 QMovie *movie=new QMovie("/wei.gif");
    ui->label->setMovie(movie);
    movie->start();

自定义封装控件:

选中项目-》右键add  new -》QT-》设计师界面类,最终会生成xx.ui,xx.h,xx.cpp三个文件;

在xx.ui中设计自定义的控件;在另外一个b.ui中添加一个相应的控件(例如xx.ui中最外层控件是QWidget,这里就添加一个Widget),然后右键-》提升为,把xx填入,然后点击右边的添加按钮-》点击提升,这时最右边模块的层级图中就会变化了;

在xx.cpp中处理控件内部需要处理的事件,在xx.h中暴露接口供外部操作;

鼠标事件:

QEvent;

 

setMouseTracking(true);//设置鼠标追踪,不需要按下,只要移动就会捕获到鼠标
void mywidget::mousePressEvent(QMouseEvent *event){
    if(event->button()==Qt::LeftButton){//如果是鼠标左键按下
    qDebug()<<"按下";
    QString str =QString("鼠标按下了x=%1 y=%2").arg(event->x()).arg(event->y());
    }
}
//鼠标移动
void mywidget::mouseMoveEvent(QMouseEvent *event){
    

}
//鼠标离开
void mywidget::mouseReleaseEvent(QMouseEvent *event){
    

}

定时器:QTimeEvent

定时器方法一:

int id1;// 定时器的唯一标识
    int id2;
    void timerEvent(QTimerEvent *event);//重写定时器


.cpp中:
//时间定时器
void  Widget::timerEvent(QTimerEvent *event){
  int id=  event->timerId();//定时器的唯一标识,用来区分是哪一个定时器
  if(id==id1){
      
  }
}

id1= startTimer(1000);//启动定时器,每隔1000毫秒执行一次定时器;返回的是定时器的唯一标识;

定时器方法二:QTimer

QTimer *timer=new QTimer(this);
   timer->start(500);
   connect(timer,&QTimer::timeout,[=](){
       
   });

timer->stop();停止定时器

事件分发器:在事件分发器中可以做事件拦截;返回值true表示要处理,false表示不处理;

bool event(QEvent *event){

 QMouseEvent *ev=static_cast(event);静态类型转换

if(event->type()==QEVENT::MouseButtonPress){ rerurn true;}判断事件做拦截,这个事件自己处理,不做分发;

return QLabel::event(event);其他事件交给父类处理,默认处理;

}

 

事件过滤器:在事件分发器之前还可以做一次事件过滤;

ui->label->installEventFilter(this);//给label安装事件过滤器

重写:
bool Widget::eventFilter(QObject *obj,QEvent *e){
     if(obj==ui->label){
         if(e->type()==QEvent::MouseButtonPress){
             return true;
         }
     }
     return QWidget::eventFilter(obj,e);
}

绘图:

//重写绘图事件
void Widget::paintEvent(QPaintEvent *e){
    //设置画笔
    QPainter painter(this);
    //设置画笔
    QPen pen(QColor(255,0,0));
    pen.setWidth(3);//设置画笔宽度
    pen.setStyle(Qt::DotLine);//设置线的样式
    //使用画笔
    painter.setPen(pen);
    //设置画刷
    QBrush brush(QColor(0,255,0));
    brush.setStyle(Qt::Dense1Pattern);//画刷样式
    painter.setBrush(brush);

    painter.drawLine(QPoint(0,0),QPoint(100,100));//绘制线
    painter.drawEllipse(QPoint(100,100),50,50);//画圆形
    painter.setRenderHint(QPainter::Antialiasing);//抗锯齿
    painter.translate(100,0);//让画家移动
    painter.save();//保存状态
    painter.restore();//还原状态
    painter.drawText(QRect(10,200,100,100),"好好的");//绘制文字
 painter.drawPixmap(20,100,QPixmap(":/002.png"));//绘制图片
    
}
//如果要手动调用绘图事件使用update();
绘图设备:    
QPixmap pix(300,300);//绘图设备,专门为平台显示做了优化;
    pix.fill(Qt::white);//填充颜色
    QPainter painter(&pix);//设置画家
pix.scale(50,50);//缩放
    painter.drawLine(QPoint(0,0),QPoint(100,100));
    pix.save("保存的路径");//保存
    
    

            QImage img(300,300,QImage::Format_RGB32);//绘图设备,可以对像素访问
            img.fill(Qt::white);//填充颜色
            QPainter painter(&img);//设置画家
            painter.drawLine(QPoint(0,0),QPoint(100,100));
            img.save("保存的路径");//保存

利用QImage修改像素点:

    QPainter painter(this);//设置画家
    QImage img;
    img.load(":/002.png");//加载图片
    //修改像素点
    for(int i=0;i<100;i++){
        for(int j=50;i<100;j++){
            QRgb value=qRgb(255,0,0);
            img.setPixel(i,j,value);
        }
        
    }
    painter.drawImage(0,0,img);

重现绘图指令:

 QPicture qpic;//可以记录和重新绘制指令
    QPainter painter(this);//设置画家
    painter.begin(&qpic);
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(100,100),100,100);
    painter.end();
    qpic.save("保存路径");
    
   //重现绘图指令,尤其是有些后缀名打不开;但是用这个可以查看
    QPicture pic;
    pic.load("刚才绘制的路径");
    painter.drawPicture(0,0,pic);

文件:

QFile;

QString  path= QFileDialog::getOpenFileName(this,"打开文件","文件路径")
//编码格式,QT中默认是utf8
 QTetextCodec *codec=QTextCodec::codeForName("gbk");

//读取内容
 QFile file(path);
//设置打开方式
file.open(QIODevice::ReadOnly);
//读取所有内容
QByteArray array=file.readAll();
//按行读写
QByteArray sarray;
sarray=file.readLine();
codec->toUnicode(array);//转码就成了gbk格式

//循环读
while(!file.atEnd()){
    sarray +=file.readLine();
}
file.close();

//写操作
file.open(QIODecice::Append);//用追加的方式写
file.write("aaaa");
file.close();

QFileInfo:

QString  path= QFileDialog::getOpenFileName(this,"打开文件","文件路径");
    QFileInfo qinfo(path);
    qinfo.size();//文件大小
    qinfo.suffix();//文件后缀
  QDateTimele dt=  qinfo.created();//返回QDateTimele类型
    qinfo.created().toString("yyyy/MM/dd hh:mm:ss");//格式化日期
 qinfo.lastModified();//最后的修改日期

自定义按钮:

.h

#ifndef MYPUSHBUTTON_H
#define MYPUSHBUTTON_H
#include

class MyPushButton : public QPushButton
{
public:
    //参数 正常显示的图片,按下后显示的图片
    MyPushButton(QString normalImg,QString pressImg="");
    QString normalImgPath;//显示的图篇路径、
    QString pressImgPath;//按下后显示的图片路径

    //弹跳特效
    void jumptop();
signals:
public slots:
};

#endif // MYPUSHBUTTON_H



.cpp

#include "mypushbutton.h"
#include
#include
#include
MyPushButton::MyPushButton(QString normalImg,QString pressImg){
    this->normalImgPath=normalImg;
    this->pressImgPath=pressImg;

    QPixmap pix;
    bool ret=pix.load(normalImg);
    if(!ret){
        return ;
    }

this->setFixedSize(pix.width(),pix.height());//设置图片固定大小
    this->setStyleSheet("QPushButton{border:0px;}");//设置不规则样式,这个是用css的样式
    this->setIcon(pix);//设置图标
    this->setIconSize(QSize(pix.width(),pix.height()));//设置图标大小

}

//向下跳
 void  MyPushButton::jumptop(){
     //创建动画对象
     QPropertyAnimation *animation=new QPropertyAnimation(this,"geometry");//第一个参数是给谁做特效,第二个是特效类型
     animation->setDuration(200);//动画事件间隔
     animation->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));//起始位置
      animation->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));//结束位置
      animation->setEasingCurve(QEasingCurve::OutBounce);//设置弹跳曲线
      animation->start();//开始

}


使用:
MyPushButton *btn=new MyPushButton(":/[email protected]");
btn->setParent(this);
btn->move(50,50);
connect(btn,&MyPushButton::clicked,[=](){
    qDebug()<<"点击";
    //做弹起特效
   btn->jumptop();
});

this->hide();//隐藏页面

this->show();显示页面

QTimer::singleShot(5000,this,[=](){
       btn->hide();
   });//延时500毫秒执行

 设置鼠标穿透:

QLabel *lbl=new QLabel();
lbl->setAttribute(Qt::WA_TransparentForMouseEvents);//设置鼠标穿透事件,让llabel下面的控件也能接收鼠标点击

label:

QLabel *lbl=new QLabel();
lbl->setParent(this);
    QFont font;
font.setFamily("隶书");
font.setPointSize(20);
lbl->setFont(font);
QString str=QString("lev:%1").arg(1);//字符串格式化
lbl->setText(str);
lbl->setGeometry(QRect(10,10,100,100));//设置位置和大小
 lbl->setAttribute(Qt::WA_TransparentForMouseEvents);//设置鼠标穿透事件





this->geometry();当前窗口的位置和大小

音效:

如果QSound找不到头文件,在.pro文件中QT +=后面添加   multimedia;

 QSound *sd= new QSound(":/");
 sd->setLoops(2);//循环的次数,-1表示无限循环
 sd->play();//开始播放音效

项目打包:

NSIS深层打包;

你可能感兴趣的:(C/C++)