Qt基础操作c++版


#include<QPushButton>按钮头文件

class Widget : public QWidget
{
    Q_OBJECT 信号糟(宏定义) 不要删它就对了.

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};

    QPushButton *ptr=new QPushButton;创建一个按钮
    //ptr->show();以顶层方式弹出窗口控件
    ptr->setParent(this);让按钮在弹出窗口内实现
    ptr->setText("开机");按钮文本
    ptr->resize(100,50);设置按钮大小
    ptr->move(0,200);移动按钮
    QPushButton *ptr2=new QPushButton("关机",this);设置按钮文本并让按钮在弹出窗口内实现
    ptr2->resize(100,50);
    ptr2->move(500,200);
    setStyleSheet("QPushButton{border:0px;}");设置不规则样式
    resize(600,500);设置窗口大小
    setWindowTitle("主界面");设置窗口文本
    setFixedSize(600,500);设置窗口固定大小

对象树
当创建的对象在堆区时候,如果指定的父类是OObject派生下来的类,可以不用管理释放操作,
将对象会放入到对象树中,由对象树释放.

qt左标系
左上角为0,0
x以右为正方向
y以下为正方向

信号和糟
连接函数:
connect()
参数1:信号发送者
参数2:发送信号
参数3:接受信号
参数4:处理糟的信号
  QPushButton *ptr2=new QPushButton("关闭",this);
    ptr2->resize(100,50);
    ptr2->move(500,200);
    connect(ptr2,&QPushButton::clicked,this,&QPushButton::close);

自定义信号和糟
自定义信号
1.写到signals下
2.返回值 void
3.需要声明,不许要实现
4.可以有参数,可以重载
自定义糟
1.返回值 void
2.需要声明,也需要定义
3.可以有参数,可以重载
4.写到public slot下,或者全局函数.
触发的自定义信号
emit 触发自定义信号
class myts : public QObject
{
    Q_OBJECT
public:
    explicit myts(QObject *parent = nullptr);

signals:
    void yun();信号

};

class myst : public QObject
{
    Q_OBJECT
public:
    explicit myst(QObject *parent = nullptr);
    void fun();糟
signals:

};

void myst::fun() 定义糟
{
    qDebug()<<"加油!!!!!!!!!!!!!!!!!!!!!!!";
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    void kun();
private:
    Ui::Widget *ui;
    myts*ts;
    myst*st;
};

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->ts=new myts;
    this->st=new myst;
    connect(ts,&myts::yun,st,&myst::fun);
    // *ptr=new QPushButton("发信息",this); 注释这里就是信号连接信号
   // ptr->resize(200,100);
   // resize(800,800);
    //connect(ptr,&QPushButton::clicked,ts,&myts::yun);


    kun();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::kun() 定义触发信号
{
    emit ts->yun();
}

当定义信号和糟出现的重载
需要用到函数指针 明确指向函数的地址
void(myst::*p)(QString name)=&myst::fun;
void(myts::*p2)(QString name)=&myst::yun;
connect(ts,p2,st,p);
QString转char*
.ToUtf8()转QByteArray
.Data()转为char*
   qDebug()<<"姓什么"<<name.ToUtf8().Data();
用qDebug()需要导入头文件#include<QDebug>

信号可以连接信号
断开信号 disconnect()
disconnect(ts,&myts::yun,st,&myst::fun);

信号可以连接信号
一个信号可以连接多个糟函数
多个信号可以连接同一个糟函数
信号和糟函数参数类型必须类型一一对象
信号的参数个数可以多余糟函数的参数个数
信号糟可以断开连接 disconnect()

QT4版本写法
connect(信号发送者,发送信号SIGNAL(信号),信号接受者,糟函数SLOT(糟函数))
优点 参数直观 
缺点 编译器不给检测参数类型
lambda表达式
[]标识符 匿名函数
=值传递
&引用传递
()参数
{}实现体
mutable 修饰 值传递变量,可以修改拷贝的数据,改变不了本体
返回值 []()->int{}

菜单栏最多只有一个
#include<QMenuBar>菜单栏
#include<QMenu>菜单 (可以不用导入)
#include<QToolBar>工具栏
#include<QStatusBar>状态栏
#include<QLabel>标签控件
#include<QDockWidget>铆接窗口
#include<QTextEdit>核心部件
  QMenuBar*ptr1=menuBar();菜单栏创建
    setMenuBar(ptr1);将菜单栏放到窗口中
    QMenu*p1=ptr1->addMenu("文件");创建菜单
    QAction*p=p1->addAction("新建");创建菜单项
    p1->addSeparator();添加分割符(创建分割线)
工具栏可以有多个
 QToolBar*ptr2=new QToolBar(this);创建工具栏
 addToolBar(Qt::LeftToolBarArea,ptr2);将工具栏放到窗口中,默认工具栏停靠设置在左边 addToolBar(默认停靠区域,ptr2)
ptr2->setAllowedAreas(Qt::LeftToolBarArea|Qt::RightToolBarArea);后期设置 设置只允许左右停靠
ptr2->setFloatable(false);设置浮动  true开启浮动  false关闭浮动
ptr2->setMovable(true);设置移动(总开关)  true开启移动  false关闭移动
 ptr2->addAction("工具栏");工具栏可以设置内容
 ptr2->addSeparator();添加分割线
 QPushButton*ptr3=new QPushButton("移动",this);
ptr2->addWidget(ptr3);工具栏添加控件
状态栏 最多有一个
    QStatusBar*statu=statusBar();
    setStatusBar(statu);设置到窗口中
    QLabel*label=new QLabel("提示信息");放标签控件
    statu->addWidget(label);放到左侧信息
    QLabel*label2=new QLabel("坐标");
    statu->addPermanentWidget(label2);放到右侧信息
铆接窗口 浮动窗口 可以多个
QDockWidget*dock=new QDockWidget("移动",this);
    addDockWidget(Qt::BottomDockWidgetArea,dock); 停靠区域设置为了下 addDockWidget(默认停靠区,浮动窗口指针)
    dock->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea);设置后期停靠区域 
设置核心部件 只能一个
  QTextEdit*txet=new QTextEdit(this);
    setCentralWidget(txet);显示核心部件
资源文件
    将图片文件拷贝到项目位置下(在.h或者.cpp鼠标右键选择在Explorer中显示就是项目的目录) 
    右键项目->添加文件->QT->QT recourse File->给文件起名
    res生成res.qrc
    open in editor 编译资源
    添加前缀 添加文件
    使用":+前缀名+文件名"
列如:   ui->actionxinjian->setIcon(QIcon(":/ziyuan/OIP-C.jfif"));
分类:
#include<QDialog>
模拟对话框 不可以对其他窗口进行操作 阻塞
 QDialog lvg(this);
        lvg.exec();
例子: connect(ui->actionxinjian,&QAction::triggered,[=](){
        QDialog lvg(this);
        lvg.exec();)};
非模拟对话框 可以对其他窗口进行操作
 QDialog *pa=new QDialog(this);      
        pa->show();
例子: connect(ui->actionxinjian,&QAction::triggered,[=](){ connect(ui->actionxinjian,&QAction::triggered,[=](){
 QDialog *pa=new QDialog(this);      
        pa->show();
pa->setAttribute(Qt::WA_DeleteOnClose);
标准对话框-消息对话框
#include<QMessageBox>
QMessageBox 静态成员函数,创建对话框 
错误,信息,提问,警告
参数1 父类指针  参数2 标题  参数3 显示内容  参数4 按键类型(默认值)  参数5 默认关联回车按键(默认值)
 QMessageBox::critical(this,"critical","错误");
QMessageBox::information(this,"information","信息");
QMessageBox::question(this,"question","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel);
QMessageBox::warning(this,"warning","警告");
例子:
 connect(ui->actionxinjian,&QAction::triggered,[=](){
    //获取值他的捕获按键
   if(QMessageBox::Save== QMessageBox::question(this,"question","提问",QMessageBox::Save|QMessageBox::Cancel,QMessageBox::Cancel))
        {
            qDebug()<<"true";

        }
        else
        {
            qDebug()<<"flase";
        }
});
其他标准对话框
颜色对话框 
#include<QColorDialog>
  QColorDialog::getColor
例子:
  connect(ui->actionxinjian,&QAction::triggered,[=](){
      QColor vg= QColorDialog::getColor(QColor(243,54,32));
       qDebug()<<"r"<<vg.red()<<"g"<<vg.green()<<"b"<<vg.blue();

    });
文件对话框
#include<QFileDialog>
QFileDialog::getOpenFileName(参数1 父类指针 , 参数2 标题,   参数3 默认打开路径,  参数4 过滤文件格式)
例子:
 connect(ui->actionxinjian,&QAction::triggered,[=](){
   QString a= QFileDialog::getOpenFileName(this,"打开文件","D:\BaiduNetdiskDownload","(*.pdf)");
   qDebug()<<a;
});
字体对话框
#include<QFontDialog>
QFontDialog::getFont
例子:
   connect(ui->actionxinjian,&QAction::triggered,[=](){
        bool    falag;
   QFont  lg= QFontDialog::getFont(&falag,QFont("宋体",88));
   qDebug()<<"字体"<<lg.family().toUtf8().data()<<"字号"<<lg.pointSize()<<"是否加粗"<<lg.bold()<<"是否倾斜"<<lg.italic();
    });
}
界面布局
实现登陆窗口
利用布局方式 给窗口进行美化 
选取widget 进行布局,水平布局,垂直布局,栅格布局
给账号 密码 登录 注册按钮布局
默认窗口和控件之间有9间隙,可以调整layotleftMargin
利用弹簧进行布局
控件
按钮组
QPushButton 常用按钮
QTOOlButton 工具按钮 用于显示图片,如图想显示文字,修改风格 
toolButtonStyle,凸起风格 autoRaise
RadioButton 单选按钮,设置ui->rBtnman->setChecked(true)
CheckBox 多线按钮,监听状态,2选择 1半选 0未选 打开半选选择最后一项
QListWidget 列表容器
QListWidegetItem*item=new QListWidegetItem("刘备打麻将输了一百块钱");
ui->listwidget->addItem(item);
设置居中方式 item->seTexAlignmet(QT::AlignHcenter);
可以利用addItems 一次性添加
QTreeWindget 树控件
设置头
 ui->treeWidget->setHeaderLabels(QStringList()<<"车子"<<"特性");
创建根节点
QTreeWidgetItem *bp= new QTreeWidgetItem(QStringList()<<"冰魄");
 ui->treeWidget->addTopLevelItem(bp);
添加到根据点的控件上
bp->addChild( new QTreeWidgetItem(QStringList()<<"没有氮气时,集满氮气送一个小喷,有一个氮气,集满氮气送两个小喷(限3个小喷),集满当前氮气立马集下一个氮气"));
QTableWidget 表格控件
设置列数
ui->tableWidget->setColumnCount(3);
设置水平头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
设置行数
ui->tableWidget->setRowCount(3);
设置正文
  QString a;
    a="张三";
    QTableWidgetItem*item=new  QTableWidgetItem(a);
    ui->tableWidget->setItem(1,0,item);
其他控件
Stacked Widget 栈控件
ui->StackedWidget ->setCurrentIndex(1);
Combo Box 下拉控件
ui->comboBox->addItem("夫子");
Label 标签控件显示图片和动态图片
显示图片
ui->dongman->setAttribute(Qt::WA_TransparentForMouseEvents) ;设置属性(穿透)
ui->dongman->setPixmap(QPixmap(":/tu/fj2.jpg"));
ui->dongman->Geometry(10,20,80,31)设置左标 和宽高
显示动态图片
#include<QMovie>
    QMovie *movie=new QMovie(":/tu/2-1Z625142U9458.gif");
    ui->gougou->setMovie(movie);
    movie->start(); 播放
自定义控件封装
添加新文件-QT-设计是界面类(.h.cpp.ui)
ui中设计QSpinBox和QSlider两个控件
widget中使用了自定义控件,拓拽一个新widget,点击提升为,点击添加,点击提升


QT中的事件
鼠标事件
重写了以下五个函数
鼠标进入事件 enterEvent(QEvent *)
鼠标离开事件 leaveEVent
<以上两个在帮助文档Enterev中能找到>
鼠标按下void mousePressEvent(QMouseEvent *ev)
鼠标移动 void mouseMoveEvent
鼠标释放void  mouseReleaseEvent
坐标 ev->x(),ev->y()
ev->button()可以判断所有按键  Qt::LeftButton  Qt::RightButton
ev->buttons()判断组合按键 判断move时候的左右键的 结合 &操作符
格式化字符串QString s=QString("%1").arg(21);
案例:
void myLabel:: mousePressEvent(QMouseEvent *ev)
{   if(ev->button()==Qt::RightButton)
    {QString s=QString("x=%1,y=%2,globalX=%3,globaly=%4 ").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
    qDebug()<<"鼠标按下"<<s;
    }
    return QLabel(:: mousePressEvent(ev);
}

定时器1
利用事件 void timerEvent(QTimerEvent *e)重写
<在帮助文档timerEvent的QTimer就能找到>
启动定时器  startTimer(1000)  单位:毫秒
startTimer的返回值是唯一的标识 可以和e->timerid 作比较
案例
:(i,i2,a,a2是成员变量)
  i=0;
    i2=0;
    a=startTimer(1000);
    a2=startTimer(500);
void MainWindow:: timerEvent(QTimerEvent *e)
{
    if(e->timerId()==a)
    {
        ui->label_2->setText(QString::number(i++));
    }
    if(e->timerId()==a2)
    {
        ui->label_3->setText(QString::number(i2++));
        if(i2==60)
        {
            i2=0;
        }
    }
}

定时器2
利用定时器类QTimer
创建定时器对象  QTimer *p=new QTimer(this);
启动定时器     p->start(1000);
每隔一定毫秒发送 信号timeout ,进行监听
 connect(p,&QTimer::timeout,[=](){ ui->label_4->setText(QString::number(i3++));});
暂停p->stop()
connect(ui->pushButton,&QPushButton::clicked,[=](){p->stop();});

event事件
用途:用于事件的分类
也可以做拦截操作,不建议
bool event(QEvent*e) 重写这个函数
返回值 如果是true代表用户处理这个事件,不向下分发
e->type()==QEvent::MouseButtonPress 鼠标
案例:
bool MainWindow::event(QEvent*e) 
{
    if(e->type()==QEvent::MouseButtonPress)
    {
        QString s=QString("x=%1,y=%2,globalX=%3,globaly=%4 ").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug()<<"鼠标按下"<<s;
        return true;
    }
     return QLabel::event(e);
}

事件过滤器
在程序中将时间分发到事件分发器前,可以利用过滤拦截
步骤
1.给控件安装过滤器
ui->label->installEventFilter(this);
2.重写eventFilter事件
bool MainWindow::eventFilter(QObject*obj,QEvent*e)
{
    if(obj==ui->label)
    {
        if(e->type()==QEvent::MouseButtonPress)
    {
        QString s=QString("x=%1,y=%2,globalX=%3,globaly=%4 ").arg(ev->x()).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
            qDebug()<<"鼠标按下"<<s;
        return true;
    }
    return eventFilter(obj,e);
}

QPainter绘图
绘图事件void paintEvent(QPaintEvent*) 重写此函数
声明一个画家对象 QPainter painter(this); this指定绘图设备
#include<QPainter>
设置画笔颜色 宽度 风格
颜色:
 QPen pen(QColor(155,255,21));
宽度:
pen.setWidth(5);
风格:
pen.setStyle(Qt::DashLine);
使用这个画笔:
 painter.setPen(pen);
设置画刷 颜色 风格
颜色:
QBrush brush(Qt::yellow)
风格:
brush.setStyle(Qt::FDiagPattern);
使用这个画刷:
painter.setBrush(brush);
画线 画圆 画矩形 画文字
线:
painter.drawLine(QPoint(0,0),QPoint(300,200));
圆:
painter.drawEllipse(QPoint(700,30),30,30);
矩形:
painter.drawRect(QRect(300,400,40,40));
文字:
painter.drawText(QRect(100,400,150,50),"仁尽天下");

QPainter高级设置
抗锯齿 效率低
painter.setRenderHint(QPainter::Antialiasing);
对画家进行移动
painter.translate(100,0);
保存当前状态
painter.save();
还原当前状态
painter.restore();
如果想手动调用绘图事件,利用updata
利用画家画图片painter.drawPixmap(x,y,QPixmap(图片));
案例:
    QTimer*tmer=new QTimer(this);
    tmer->start(500);
    connect(tmer,&QTimer::timeout,[=](){update();});
void MainWindow :: paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    a+=5;//a b是成员变量
    b+=6;
    if(a>this->width())
    {
        a=0;
    }
    if(b>this->height())
    {
        b=0;
    }
    painter.drawPixmap(a,b,QPixmap(":/x/OIP-C (2).jfif"));
}

QpainterDevice绘图设备
QPixmap,QImage,QBitmap(黑白色) QPicture QWidget
QPixmap  对不同的平台做了显示的优化
QPixmap pix(300,300);
pix.fill(Qt::white);填充颜色
利用画家往pix上面画画  QPainter painter(&pix);
pix.save("路径");保存图片
案例:
#include<QPixmap>
    QPixmap pix(300,300);
    pix.fill(Qt::white);
    QPainter painter(&pix);
    painter.setPen(Qt::SolidLine);
    painter.drawEllipse(QPoint(200,200),50,50);
    pix.save("H:\\yuan.png");
QImage 对不同平台做了显示的优化
使用和QPixmap差不多 QImage img(300,300,QImage::Format_RGB32);
其他流程和QPixmap一样
可以对像素进行修改 img.setPixel(w,h,颜色)
案例:
#include<QImage>
void Widget:: paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QImage img(300,300,QImage::Format_RGB32);
    img.load(":/x/fj3.jpg");
    for (int a=50;a<100 ;a++ )
    {
        for (int b=50;b<100 ;b++ ) {
            QRgb rgb=qRgb(0,32,212);
            img.setPixel(a,b,rgb);
        }
    }
    painter.drawImage(0,0,img);
}
QPicture 记录和重现 绘图指令
QPicture pt;
pt.save(任意后缀名)
重现 利用画家可以重现painter.drawPicture(0,0,pt);
案例:
#include<QPicture>
    QPicture pt;
    QPainter painter;
    painter.begin(&pt);
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(300,300),50,50);
    painter.end();
    pt.save("H:\\juxing.aodj");
void Widget:: paintEvent(QPaintEvent*)
{
    QPainter painter(this);
    QPicture pt;
    pt.load("H:\\juxing.aodj");
   painter.drawPicture(0,0,pt);
}

QFile 对文件进行读写操作
QFile 进行读写操作
QFile file(path 文件路径)

file.open(打开方式);QIODevice::ReadOnly
全部读取 file.readAll() 按行读取file.readLine() 判断文件是否读到文件尾file.atEnd()
默认支持编码格式utf-8
利用编码格式 指定格式 QTextCodec 
QTextCodec *codec= QTextCodec::codecForName("gbk");
 ui->textBrowser->setText(codec->toUnicode(array));
文件对象关闭 file.close();
案例:
#include<QFile>
#include<QTextCodec>
    connect(ui->pushButton,&QPushButton::clicked,[=](){QString a= QFileDialog::getOpenFileName(this,"打开文件","E:\qttxtx");
    ui->lineEdit->setText(a);
   // QTextCodec *codec= QTextCodec::codecForName("gbk");
    QFile file(a);
    file.open(QIODevice::ReadOnly);
//    QByteArray array= file.readAll();
    QByteArray array;
    while (!file.atEnd()) {
        array +=file.readLine();
    }
    file.close();
    ui->textBrowser->setText(array);
    });

    file.open(打开方式);
    file.write(内容);
    file.close();

QFileInfo 读取文件信息
QFileInfo info(路径);
案例:
#include<QFileInfo>
#include<QDebug>
#include<QDateTime>
    QFileInfo info(a);
    qDebug()<<"大小:"<<info.size()<<"后缀名:"<<info.suffix()<<"文件名称:"<<info.fileName()<<"文件路径:"<<info.filePath();
    qDebug()<<"创建日期"<<info.created().toString("yyyy/MM/DD hh::mm::ss");
    qDebug()<<"最后修改日期"<<info.lastModified().toString("yyyy-MM-dd hh:mm:ss");

动态特效
#include<QPropertyAnimation>
创建动态对象
QPropertyAnimation *am=new QPropertyAnimation(this,"geometry");
设置动画间隔
am->setDuration(200);
设置起始位置
 am->setStartValue(QRect(this->x(),this->y(),this->width(),this->height()));
设置结束位置
am->setEndValue(QRect(this->x(),this->y()+10,this->width(),this->height()));
设置弹跳曲线
am->setEasingCurve(QEasingCurve::OutBounce);
执行动画
 am->start();

音效
#include<QSound>
创建音效对象
QSound *sd=new QSound(导入音效文件的路径,this);
播放音效 
    sd->play();
设置循环    
    sd->setLoops(-1); -1是死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值