信号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;
}