Qt学习记录

信号singal 

#include "widget.h"
#include "ui_widget.h"

#include "teacher.h"
#include "student.h"

#include <QPushButton>>

//teacher 类 老师类
//student 类 学生类
//需求:下课后,老师会出发一个信号,饿了,学生响应信号,请客吃饭

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //创建一个老师对象
    this->zt = new Teacher(this);

//    Teacher * zt = new Teacher ;

    //创建一个学生对象
    this->st = new Student(this);

//    Student * st = new Student ;

    //老师饿了,学生请吃饭

//    connect( zt , &Teacher :: hungry ,st , &Student :: treat);

//    //调用下课函数
//    classIsOver();


    //连接带参数的信号和槽
    //指针 -> 地址
    //函数指针 -> 函数地址

    void (Teacher :: *teacherSingal) (QString) = &Teacher ::hungry;
    void (Student :: *studentSlot) (QString) = &Student ::treat;


    connect(zt, teacherSingal ,st , studentSlot );
    //classIsOver();



    //点击一个下课的按钮,再触发下课
    QPushButton *btn = new QPushButton("下课",this);
    //重置窗口大小
    this -> resize (600,400);

    //点击按钮,触发下课
//    connect (btn, &QPushButton :: clicked, this, &Widget :: classIsOver);

    //无参信号和槽链接

    void (Teacher :: *teacherSingal2) (void) = &Teacher ::hungry;
    void (Student :: *studentSlot2) (void) = &Student ::treat;
    connect(zt,teacherSingal2,st,studentSlot2);

    //信号连接信号
    connect (btn, &QPushButton :: clicked, zt, teacherSingal2);

    //断开信号
    disconnect(zt,teacherSingal2,st,studentSlot2);

    //拓展
    //1.信号是可以连接信号的
    //2.一个信号可以连接多个槽函数的
    //3.多个信号可以连接同一个槽函数
    //4.信号和槽函数的参数类型必须一一对应
    //5.信号和槽的参数个数可以不一致,信号的参数个数可以多于槽的个数

}

void Widget::classIsOver()
{
    //下课函数,调用后,出发老师饿了的信号;
//    emit zt -> hungry();

    emit zt -> hungry("haochide");
}

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

其他:
  QString -> char * 的话没有引号
  先转成 QByteArray ( .toUtf8() ) 再转 char * ( .data()  )

mainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QToolBar>
#include <QMenuBar>
#include <QDebug>
#include <QPushButton>
#include <QStatusBar>
#include <QLabel>
#include <QDockWidget>
#include <QTextEdit>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //重置窗口大小
        resize(600,400);

        //创建菜单栏(菜单栏最多只能有一个)
        QMenuBar * bar =  menuBar();
        //将菜单栏放入到窗口中
//        setMenuBar(bar);

        setMenuBar(bar);


        //空栏不显示,所以要创建菜单

//        bar -> addMenu("文件");
//       bar -> setNativeMenuBar(false);

        QMenu * fileMenu = bar -> addMenu("文件");
        QMenu * editMenu = bar -> addMenu("编辑");

        //创建菜单栏
        QAction * newAction =  fileMenu -> addAction("新建");
        editMenu -> addAction("编辑");

        //添加分隔线
        fileMenu -> addSeparator();
        QAction * openAction = fileMenu -> addAction("打开");

        //工具栏,可以有多个
        QToolBar * toolbar = new QToolBar(this);
//        addToolBar(toolbar);

        //默认显示左侧
        addToolBar(Qt :: LeftToolBarArea, toolbar);

        //后期设置,只允许左右依靠
        toolbar -> setAllowedAreas( Qt :: LeftToolBarArea | Qt :: RightToolBarArea);

        //设置浮动
        toolbar -> setFloatable(false);

        //设置总开关
        toolbar -> setMovable(false);

        //工具栏里可以设置内容
        toolbar -> addAction(newAction);
        //添加分割线
        toolbar -> addSeparator();
        toolbar -> addAction(openAction);

        //工具栏中添加控件
        QPushButton * btn = new QPushButton("aa",this);
        toolbar -> addWidget(btn);

        //状态栏(最多有一个)
        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);

}

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

对话框

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDialog>
#include <QDebug>
#include <QMessageBox>
#include <QColorDialog>
#include <QFileDialog>
#include <QFontDialog>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    //点击新建按钮,弹出一个对话框

    connect(ui -> actionnew, &QAction :: triggered,[=](){
        //对话框 分类
        //模态对话框(不可以对其他窗口进行操作) 非模态对话框 (可以对其他窗口进行操作)
        //模态创建
//        QDialog dlg(this);
//        dlg.resize(200,100);
//        dlg.exec();
//        qDebug() << "模态对话框弹出了";

        //非模态创建
//        QDialog * dlg2 = new QDialog(this);
//        dlg2 -> show();
//        dlg2 -> setAttribute( Qt :: WA_DeleteOnClose);  //55号属性
//        qDebug() << "非模态对话框弹出了";


        //消息对话框
        //错误对话框
//        QMessageBox :: critical(this,"critical","错误");

        //信息对话框
//        QMessageBox :: information(this,"info","信息");

        //提问对话框
        //参数1 父亲 2 标题 3 提示内容 4 案件类型 5 默认关联回车按键
//        QMessageBox :: question(this,"ques","提问", QMessageBox :: Save | QMessageBox :: Cancel
//                                ,QMessageBox :: Cancel);

        //判断点击

//          if( QMessageBox :: Save ==  QMessageBox :: question (this,"ques","提问", QMessageBox :: Save | QMessageBox :: Cancel  ,QMessageBox :: Cancel) )
//          {
//              qDebug() << "选择的是保存"
//          }
//                          else
//              {
//            qDebug() << "选择的是取消"
//          }


        //警告对话框
//        QMessageBox ::  warning(this,"warning","警告");


        //其他标准对话框
//        QColor color = QColorDialog :: getColor( QColor(Qt::red) );
//        qDebug() << "r = " << color.red() << " g= " << color.green() << " b= " << color.blue();


        //文件对话框  父亲  标题  默认打开路径  过滤文件格式
        //返回值是选取的路径
//        QString str =  QFileDialog :: getOpenFileName(this,"打开文件","/Users/lvyan/Desktop","(*.jpg)");
//        qDebug() << str;


        //字体对话框
        bool flag;
        QFont font =  QFontDialog :: getFont(&flag,QFont("Libian SC",36));
        qDebug() <<  "字体:" << font.family() << "字号:" << font.pointSize() << "是否加粗:" << font.bold() << "是否倾斜:" << font.italic();

    });
}

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

控件

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QListWidgetItem>
#include <QStringList>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //设置单选按钮  男默认选中
    ui -> manBtn -> setChecked(true);

    //选中女后,打印信息
    connect( ui -> womenBtn , &QRadioButton :: clicked , [=](){
        qDebug() << "选中女";
    });


    //多选按钮, 2是选中,0是未选中,1是半选状态,需要把 tristate 选为 true
    connect( ui -> checkBox_3 , &QCheckBox ::stateChanged, [=](int state){
        qDebug() << state;
    });

    //利用listWidget写诗
//    QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
//    ui -> listWidget -> addItem(item);
//    item -> setTextAlignment( Qt :: AlignHCenter );

    //QStringList
    QStringList list;
    list << "锄禾日当午" << "汗滴禾下土";
    ui -> listWidget -> addItems(list);

}

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

树控件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //treeWidget 树控件使用

    //设置水平头
    ui -> treeWidget -> setHeaderLabels(QStringList() << "英雄" << "英雄介绍");

    QTreeWidgetItem * liItem = new QTreeWidgetItem(QStringList() << "力量");
    QTreeWidgetItem * minItem = new QTreeWidgetItem(QStringList() << "敏捷");
    QTreeWidgetItem * zhiItem = new QTreeWidgetItem(QStringList() << "智力");

    //加载顶层的节点
    ui -> treeWidget -> addTopLevelItem(liItem);
    ui -> treeWidget -> addTopLevelItem(minItem);
    ui -> treeWidget -> addTopLevelItem(zhiItem);

    //追加子节点
    QStringList hero1;
    hero1 << "刚被猪" << "吸收伤害造成输出";
    QTreeWidgetItem * l1 = new QTreeWidgetItem(hero1);
    liItem -> addChild(l1);

}

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

表格控件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //TableWidget 控件

    //设置列数
    ui -> tableWidget -> setColumnCount(3);
    //设置表头
    ui -> tableWidget -> setHorizontalHeaderLabels(QStringList() << "姓名" << "性别" << "年龄" );
    //设置行数
    ui -> tableWidget -> setRowCount(5);
    //设置正文
    ui -> tableWidget -> setItem( 0,0, new QTableWidgetItem("亚瑟"));


    QStringList nameList;
    nameList << "亚瑟" << "赵云" << "张飞" << "关羽" << "花木兰";
    QList<QString> sexList;
    sexList << "男" << "男" << "男" << "男" << "女";

    for ( int i = 0; i < 5  ; i++)
    {
        int col = 0;
        ui -> tableWidget -> setItem( i, col++, new QTableWidgetItem(nameList[i]));
        ui -> tableWidget -> setItem( i, col++, new QTableWidgetItem(sexList.at(i)));
        //int 转为 QString
        ui -> tableWidget -> setItem( i, col++, new QTableWidgetItem(QString :: number (i+18)));
    }

}

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

封装自定义控件 smallWidget

smallWidget.h

#ifndef SMALLWIDGET_H
#define SMALLWIDGET_H

#include <QWidget>

namespace Ui {
class smallWidget;
}

class smallWidget : public QWidget
{
    Q_OBJECT

public:
    explicit smallWidget(QWidget *parent = nullptr);
    ~smallWidget();

    //获取数字
    void setNum (int num);
    //设置数字
    int getNum();

private:
    Ui::smallWidget *ui;
};

#endif // SMALLWIDGET_H

smallWidget.cpp

#include "smallwidget.h"
#include "ui_smallwidget.h"

smallWidget::smallWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::smallWidget)
{
    ui->setupUi(this);

    //QSpinBox 移动,QSlider 跟着移动

    //5.5以上的版本可以直接写 &QSpinBox :: valueChanged
    //以下版本替换为   void( QSpinBox :: *spSingal ) (int) = &QSpinBox :: valueChanged;
    connect( ui -> spinBox ,&QSpinBox :: valueChanged , ui -> horizontalSlider , &QSlider :: setValue);

    // QSlider 滑动, QSpinBox 跟着移动
    connect( ui -> horizontalSlider ,&QSlider :: valueChanged , ui -> spinBox , &QSpinBox :: setValue);
}

//获取数字
void smallWidget :: setNum (int num){
    ui -> spinBox -> setValue(num);
}

//设置数字
int smallWidget :: getNum(){
    return ui -> spinBox -> value();
}


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

鼠标移动事件

#include "mylabel.h"
#include <QDebug>
#include <QMouseEvent>


myLabel::myLabel(QWidget *parent)
    : QLabel{parent}
{

    //设置鼠标的追踪
    setMouseTracking(true);
}

//鼠标进入
void myLabel :: enterEvent(QEnterEvent * enterEvent){
//    qDebug() << "鼠标进入了";
}

//鼠标离开
void myLabel :: leaveEvent(QEvent *){
//    qDebug() << "鼠标离开了";
}

//鼠标点击事件
void myLabel :: mousePressEvent(QMouseEvent *ev){

    //当鼠标左键按下
//    if (ev -> button() == Qt::LeftButton) {
    QString str = QString("鼠标按下了 x = %1   y= %2  x = %1   globalX= %3  globalY= %4").arg(ev -> x()).arg(ev -> y()).arg(ev -> globalX()).arg(ev -> globalY());

    qDebug() << str;
//    }
}

//鼠标移动事件
void myLabel :: mouseMoveEvent(QMouseEvent *ev){
//    if (ev -> buttons() & Qt::LeftButton) {
          QString str = QString("鼠标移动了 x = %1   y= %2  x = %1   globalX= %3  globalY= %4").arg(ev -> x()).arg(ev -> y()).arg(ev -> globalX()).arg(ev -> globalY());
        qDebug() << str;
//    }

}


//鼠标释放事件
void myLabel :: mouseReleaseEvent(QMouseEvent *ev){

//    if (ev -> button() == Qt::LeftButton) {
        qDebug() << "鼠标释放了";
//    }

}

定时器,event事件,事件过滤器

#include "widget.h"
#include "ui_widget.h"
#include <QTimer>  //定时器类
#include <QMouseEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //启动定时器
    id1 = startTimer(1000);
    id2 = startTimer(2000);


    //定时器第二种方式
    QTimer * timer = new QTimer(this);
    //启动定时器
    timer -> start(500);
    connect(timer,&QTimer :: timeout ,[=](){
        static int num = 1;
        //label_4 每隔一秒加一
        ui -> label_4 -> setText( QString :: number(num ++));
    });

    //点击暂停按钮,停止定时器
    connect( ui -> btn,&QPushButton :: clicked ,[=](){
        timer -> stop();
    });

    //给 label 安装时间过滤器
    //1.步骤1 安装事件的过滤器
    ui -> label -> installEventFilter(this);
};

//步骤2 ,重写 eventFilter 事件
bool Widget :: eventFilter (QObject * obj,QEvent * e){
    if (obj == ui -> label) {

        if (e -> type() == QEvent :: MouseButtonPress) {
            //静态类型转换
            QMouseEvent * ev = static_cast<QMouseEvent *>(e);
            QString str = QString("事件过滤器中中 鼠标按下了 x = %1   y= %2  x = %1   globalX= %3  globalY= %4").arg(ev -> x()).arg(ev -> y()).arg(ev -> globalX()).arg(ev -> globalY());
            qDebug() << str;
            //代表用户自己处理这个事件,不向下分发
            return true;
        }

    }

    //其他默认处理
    return QWidget :: eventFilter(obj,e);
}

void Widget :: timerEvent(QTimerEvent * ev){

    if ( ev -> timerId() == id1) {
        static int num = 1;
        //label_2 每隔一秒加一
        ui -> label_2 -> setText( QString :: number(num ++));
    }

    if ( ev -> timerId() == id2) {
        //label_3 每隔两秒加一
        static int num2 = 1;
        ui -> label_3 -> setText( QString :: number(num2 ++));
    }
}

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

画家

#include "widget.h"
#include "ui_widget.h"
#include <QPainter> //画家类
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击移动按钮,移动图片
    connect( ui -> pushButton , &QPushButton :: clicked, [=](){

        qDebug () << "我点击了按钮";
        //如果要手动调用绘图事件,用update 更好
        posX += 20;
        update();
    });


}

void Widget :: paintEvent(QPaintEvent *) {

//  //实例化画家对象,this 制定绘图设备
//  QPainter painter(this);

//  //设置画笔
//  QPen pen(QColor(255,0,0));
//  //设置画笔宽度
//  pen.setWidth(5);
//  //设置画笔的风格
//  pen.setStyle(Qt::DotLine);
//  //让画家使用这个笔
//  painter.setPen(pen);

//  //设置画刷(填充颜色)
//  QBrush brush (Qt :: cyan);
//  //设置画刷风格
//  brush.setStyle(Qt::Dense1Pattern);
//  //让画家使用这个笔
//  painter.setBrush(brush);

//  //画线
//  painter.drawLine(QPoint(0, 0), QPoint(100, 100));

//  //画圆
//  painter.drawEllipse( QPoint(100,100),50,50);

//  //画矩形(x坐标,y坐标,长,宽)
//  painter.drawRect(QRect(20,20,50,50));

//  //画文字
//  painter.drawText(QRect(10,200,100,50),"好好学习,天天向上");


  /高级设置///
//  QPainter painter(this);
//  painter.drawEllipse(QPoint(100,50),50,50);
//  //设置 抗锯齿能力 效率较低
//  painter.setRenderHint(QPainter :: Antialiasing);
//  painter.drawEllipse(QPoint(200,50),50,50);

  //画一个矩形
//  painter.drawRect(QRect(20,20,50,50));
//  //移动画家
//  painter.translate(100,0);
//  //保存画家的状态
//  painter.save();
//  painter.drawRect(QRect(20,20,50,50));

//  //还原画家的状态
//  painter.restore();
//  painter.translate(100,0);
//  painter.drawRect(QRect(20,20,50,50));


  ///利用画家画资源图片
  QPainter painter(this);

  //如果超出屏幕,从0开始

  if ( posX > this -> width()) {
      posX = 0;
  }


  painter.drawPixmap(posX,0,QPixmap(":/imgs/1.png"));


}

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

绘图设备

#include "widget.h"
#include "ui_widget.h"
#include <QPixmap>
#include <QPainter>
#include <QPicture>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    /pixmap绘图设备,专门为平台做了显示的优化
//    QPixmap pix(300,300);
    
//    //填充颜色
//    pix.fill(Qt::white);

//    //声明画家
//    QPainter  painter(&pix);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    pix.save("/Users/lvyan/Desktop/text1.png");
    
    
    
  
    /QImage 绘图设备  可以对像素进行访问
//    QImage img(300,300,QImage::Format_RGB32);
//    img.fill(Qt::white);
//    QPainter  painter(&img);
//    painter.setPen(QPen(Qt::blue));
//     painter.drawEllipse(QPoint(150,150),100,100);
    
    
    /QPicture 绘图设备  可以记录和重现绘图指令
    QPicture pic;
    QPainter  painter;
    painter.begin(&pic);
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();
    
    //保存到磁盘
    pic.save("/Users/lvyan/Desktop/text1.zt");    
    
}

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

文件

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
//#include <QTextCodec>  Qt6版本无了
//#include <QtCore5Compat/QTextCodec>

#include <QFileInfo>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //点击选取文件按钮,弹出文件对话框

    connect(ui -> pushButton ,&QPushButton::clicked,[=](){

       QString path =  QFileDialog::getOpenFileName(this,"打开文件","/Users/lvyan/Desktop");

       //将路径放入lineEdit中
       ui -> lineEdit -> setText(path);

       //编码格式类
//       QTextCodec * codec = QTextCodec :: codecForName("gbk");

       //读取内容,放入到TextEdit中
       //QFile 默认支持的格式是 utf-8

       QFile file(path); //参数是读取文件的路径
       //设置打开方式
       file.open(QIODevice::ReadOnly);
       //将读到的东西放入到textEdit中
       QByteArray array = file.readAll();
       ui -> textEdit -> setText(array);

//       ui -> textEdit -> setText(codec -> toUnicode(array));

       //对文件对象进行关闭
       file.close();

       //进行写文件
//       file.open(QIODevice::Append); //用追加方式追写
//       file.write("1234");
//       file.close();



       //QFileInfo文件信息类
       QFileInfo info(path);
       qDebug() << "大小:" << info.size() << "后缀名:" << info.suffix() << "文件名称:" << info.fileName() << "文件路径:" << info.path();
       qDebug() << "创建日期:" << info.birthTime().toString("yyyy/MM/dd hh:mm:ss");
       qDebug() << "最后修改日期" << info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
    });
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值