svn
vss
git
myWidget
,基类有种选择QWidget
,QMainWindow
,QDialog
#include "mywidget.h"
#include // 包含一个应用程序类的头文件
// 程序入口 argc命令行变量的数量 argv命令行变量的数组
int main(int argc, char *argv[])
{
// a应用程序对象,在QT中 应用程序对象,有且只有一个
QApplication a(argc, argv);
// 窗口对象 myWidget对象 -> QWidget
myWidget w;
// show 方法 默认不会现实,必须要调用show方法现实窗口
w.show();
// 让应用程序对象进入消息循环机制
// 让代码阻塞到这行
return a.exec();
}
#include "mywidget.h"
// 命名规范
// 类名 首字母大写,单词和单词之间首字母大写
// 函数名 变量名称 首字母小写,单词和单词之间首字母大写
// 快捷键
// 注释 ctrl + /
// 运行 ctrl + R
// 编译 CTRL + B
// 字体缩放 ctrl + 鼠标滚轮
// 查找 ctrl + F
// 整行移动 ctrl + shift + ↑ 或者 ↓
// 帮助文档 F1
// 自动对齐 ctrl + i
// 同名之间的.h 和 .cpp切换 F4
// 帮助文档 第一种方式 F1 第二种左侧按钮 第三章
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
}
myWidget::~myWidget()
{
}
myWidget::myWidget(QWidget *parent)
: QWidget(parent)
{
//创建一个按钮
QPushButton * btn = new QPushButton;
//btn ->show();// show 以顶层方式弹出窗口控件
// 让btn对象 以来在 mywidget窗口中
btn->setParent(this);
// 显示文本
btn->setText("第一个按钮");
// 创建第二个按钮 按照控件的大小创建窗口
QPushButton * btn2 = new QPushButton("第二个按钮",this);
// 移动btn2
btn2->move(100,100);
// 重置窗口大小
resize(600,400);
// 设置固定窗口大小
setFixedSize(600,400);
// 设置窗口标题
setWindowTitle("第一个窗口");
}
// 需求,点击按钮 关闭窗口
// 参数1 信号的发送者
// 参数2 发送的信号(函数的地址)
// 参数3 信号的接收者
// 参数4 处理的槽函数
// connect(btn2,&QPushButton::clicked,this,&myWidget::close);
connect(btn2,&QPushButton::clicked,this,&QWidget::close);
teacher.h
信号(只需要声明,不需要实现)#ifndef TEACHER_H
#define TEACHER_H
#include
class Teacher : public QObject
{
Q_OBJECT
public:
explicit Teacher(QObject *parent = nullptr);
signals:
// 自定义信号 写道signals下
// 返回值是 void ,只需要声明,不需要实现
// 可以有参数,可以重载
void hungry();
};
#endif // TEACHER_H
teacher.cpp
#include "teacher.h"
Teacher::Teacher(QObject *parent)
: QObject{parent}
{
}
student.h
槽函数(需要声明,也需要实现)#ifndef STUDENT_H
#define STUDENT_H
#include
class Student : public QObject
{
Q_OBJECT
public:
explicit Student(QObject *parent = nullptr);
// 早期QT版本 必须 写道public slots ,高级版本可以写道public或者全局下
// 返回值 void ,需要声明,也需要实现
// 可以有参数,可以发生重载
void treat();
signals:
};
#endif // STUDENT_H
student.cpp
#include "student.h"
#include
Student::Student(QObject *parent)
: QObject{parent}
{
}
void Student::treat()
{
qDebug() << "请老师吃饭";
}
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include "teacher.h"
#include "student.h"
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
Teacher * zt;
Student * st;
void classIsOver();
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
// Teacher类老师类
// student类学生类
//下课后,老师会触发一个信号,饿了,学生响应信号,请客吃饭
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
// 创建一个老师对象
this->zt = new Teacher(this);
// 创建一个学生对象
this->st = new Student(this);
// 老师饿了 学生请客的连接
connect(zt,&Teacher::hungry,st,&Student::treat);
// 调用下课函数
classIsOver();
}
void Widget::classIsOver()
{
// 下课函数,调用后 出发老师饿了的信号
emit zt->hungry();
}
Widget::~Widget()
{
delete ui;
}
// 连接带参数的 信号和槽
// 指针-> 地址
// 函数指针 -> 函数地址
void(Teacher:: *teacherSignal)(QString) = &Teacher::hungry;
void(Student:: *studentSignal)(QString) = &Student::treat;
connect(zt,teacherSignal,st,studentSignal);
classIsOver();
Qstring -> char*
)void Student::treat(QString foodName)
{
// Qstring -> char* 就没有双引号了 先转成QByteArray(.toYtf8()) 再转char *(.data())
// 请老师吃饭,老师要吃 "宫保鸡丁"
qDebug() << "请老师吃饭,老师要吃" << foodName.toUtf8().data();
}
// 点击一个 下课的按钮,再触发下课
QPushButton * btn = new QPushButton("下课",this);
this->resize(600,400);
// 点击按钮 触发下课
// connect(btn,&QPushButton::clicked,this,&Widget::classIsOver);
// 无参信号和槽连接
void(Teacher:: *teacherSignal2)(void) = &Teacher::hungry;
void(Student:: *studentSignal2)(void) = &Student::treat;
connect(zt,teacherSignal2,st,studentSignal2);
// 信号连接信号
connect(btn,&QPushButton::clicked,zt,teacherSignal2);
// 断开信号
disconnect(zt,teacherSignal2,st,studentSignal2);
// QT4版本以前的信号和槽连接方式
// 利用 QT4信号槽 连接无参版本
// Qt4版本底层sIGNAL ( "hungry")SLOT ( "treat")
connect(zt,SIGNAL(hungry()),st,SLOT(treat()));
// QT4版本优点,参数直观 缺点:类型不做检测
// 向下兼容
.pro
文件下,添加如下代码:
CONFIG += c++11
[ capture ] ( params ) opt -> ret { body; };
[=](){
btn->setText("aaaa");
}();
可修改标示符:
QPushButton * myBtn = new QPushButton (this) ;
QPushButton * myBtn2 = new QPushButton (this);myBtn2->move (100,100);
int m = 10;
connect (myBtn,&QPushButton::clicked,this,[m] ()mutable { m = 100+10; qDebug () <
函数返回值
函数体
案列
// 利用lambda 表达式,实现点击按钮 关闭窗口
QPushButton * btn2 = new QPushButton;
btn2->setText("关闭");
btn2->move(100,0);
btn2->setParent(this);
// connect(btn2,&QPushButton::clicked,this,[=](){
connect(btn2,&QPushButton::clicked,[=](){
// this->close();
// emit zt->hungry("宫保鸡丁");
btn2->setText("aaa");
});
#include "mainwindow.h"
#include
#include
#include
#include
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
// 重置窗口大小
resize(1000,800);
// 菜单栏 只能最多有一个
QMenuBar * bar = menuBar();
// 将菜单栏放入窗口中
setMenuBar(bar);
// 创建菜单
QMenu * fileMenu = bar->addMenu("文件");
QMenu * editMenu = bar->addMenu("编辑");
// 创建菜单项
QAction * newAction = fileMenu->addAction("新建");
// 添加分隔线
fileMenu->addSeparator();
QAction * openAction = fileMenu->addAction("打开");
// 工具栏 可以有多个
QToolBar * toolBar = new QToolBar(this);
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 * dockWidge = new QDockWidget("浮动",this);
addDockWidget(Qt::BottomDockWidgetArea,dockWidge);
// 设置后期停靠区域,只允许
dockWidge->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
// 设置中心部件 只能有一个
QTextEdit * edit = new QTextEdit(this);
setCentralWidget(edit);
}
MainWindow::~MainWindow()
{
}
报错处理
[Makefile.Debug:509: debug/qrc_res.o] Error 1
.pro
中添加 CONFIG += resources_big
// 点击新建按钮 弹出一个对话框
connect(ui->actionnew,&QAction::triggered,[=](){
// 对话框 分类
// 模态对话框(可以对其他窗口进行操作) 非模态对话框(可以对其他窗口进行操作)
// 模态创建 阻塞
// QDialog dlg(this);
// dlg.exec();
// dlg.resize(200,100);
// qDebug() << "模态对话框弹出";
// 非模态对话框
QDialog * dlg2 = new QDialog(this);
dlg2->resize(300,200);
dlg2->setAttribute(Qt::WA_DeleteOnClose);
dlg2->show();
});
// 消息对话框
// 错误对话框
// QMessageBox::critical(this,"critical","错误");
// 信息对话框
// QMessageBox::information(this,"information","信息");
// 提问对话框
// 参数1 父亲 参数2 标题 参数3 提示内容 参数4 按键类型 参数5 默认关联回车按键
// if(QMessageBox::Save == QMessageBox::question(this,"question","提问",QMessageBox::Save | QMessageBox::Cancel,QMessageBox::Cancel))
// {
// qDebug() << "选择的是保存";
// }
// else
// {
// qDebug() << "选择的是取消";
// }
// 警告对话框
// QMessageBox::warning(this,"warning","警告");
返回值也是standardButton类型,利用返回值判断用户的输入
//其他标准对话框
//颜色对话框
// QColor color = QColorDialog::getColor(QColor (255,0,0));
// qDebug() << "r = " << color.red() << " g = " << color.green() <<"b = "<
ui->rBtnMan->setChecked(true);
// 设置单选按钮 男默认选中
ui->rBtnMan->setChecked(true);
// 选中女后 打印信息
connect(ui->rBtnWoman,&QRadioButton::clicked,[=](){
qDebug() << "选中女了";
});
// 多选按钮 2 是选中 0 是未选中 tristate 属性 是 半选状态 是 1
connect(ui->cBox,&QCheckBox::stateChanged,[=](int state){
qDebug() << state;
});
// 利用listWidget 写诗 一行内容
// QListWidgetItem * item = new QListWidgetItem("锄禾日当午");
// // 将一行诗放入到listWidget 控件中
// ui->listWidget->addItem(item);
// 水平居中
// item->setTextAlignment(Qt::AlignHCenter);
// QSringList Qlist
QStringList list;
list << "锄禾日当午" << "汗滴禾下土" ;
ui->listWidget->addItems(list);
// 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 heroL1;
heroL1 <<"刚被猪"<<"前排坦克,能在吸收伤害的同时造成可观的范围输出";
QTreeWidgetItem * l1 = new QTreeWidgetItem(heroL1);
liItem->addChild(l1);
// tableWidget 控件
// 设置列数
ui->tableWidget->setColumnCount(3);
// 设置水平表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<"姓名"<<"性别"<<"年龄");
// 设置行数
ui->tableWidget->setRowCount(5);
// 设置正文
// ui->tableWidget->setItem(0,0,new QTableWidgetItem("亚瑟"));
QStringList nameList;
nameList<< "亚瑟" << "赵云" << "张飞" << "关羽" << "花木兰";
QList 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))); // 访问过界 【】 崩掉 at 抛出异常
// int 转 QString
ui->tableWidget->setItem(i,col++,new QTableWidgetItem( QString::number(i+18)));
}
// 栈控件使用
// 设置默认值 scrollArea
ui->stackedWidget->setCurrentIndex(1);
//scrollArea
connect(ui->btn_scrollArea,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(1);
});
// toolBox
connect(ui->btn_toolBox,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(2);
});
// tabWidget
connect(ui->btn_tabWidget,&QPushButton::clicked,[=](){
ui->stackedWidget->setCurrentIndex(0);
});
// 下拉框
ui->comboBox->addItem("奔驰");
ui->comboBox->addItem("宝马");
ui->comboBox->addItem("tuolaji");
// 点击按钮 选中拖拉机选项
connect(ui->btn_selectta,&QPushButton::clicked,[=](){
// ui->comboBox->setCurrentIndex(2);
ui->comboBox->setCurrentText("tuolaji");
});
// 利用QLabel显示图片
// ui->label->setPixmap(QPixmap("路径"));
// 利用QLavel显示 gif动态图片
// QMovie * movie = new QMovie("路径");
// ui->label->setMovie(movie);
// // 播放动图;
// movie->start();
#ifndef SMALLWIDGET_H
#define SMALLWIDGET_H
#include
namespace Ui {
class smallWidget;
}
class smallWidget : public QWidget
{
Q_OBJECT
public:
explicit smallWidget(QWidget *parent = nullptr);
~smallWidget();
// 设置数字
void setNum(int num);
// Huoqu数字
int getNum();
private:
Ui::smallWidget *ui;
};
#endif // SMALLWIDGET_H
#include "smallwidget.h"
#include "ui_smallwidget.h"
smallWidget::smallWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::smallWidget)
{
ui->setupUi(this);
// QSpinBox 移动 QSlider跟着移动
//函数指针
void(QSpinBox:: * spSignal)(int) = &QSpinBox::valueChanged;
connect(ui->spinBox,spSignal,ui->horizontalSlider,&QSlider::setValue);
//QSlider滑动 QSpinBox跟着移动
connect(ui->horizontalSlider,&QSlider::valueChanged,ui->spinBox,&QSpinBox::setValue);
}
// 设置数字
void smallWidget::setNum(int num)
{
ui->spinBox->setValue(num);
}
// Huoqu数字
int smallWidget::getNum()
{
return ui->spinBox->value();
}
smallWidget::~smallWidget()
{
delete ui;
}
#include "widget.h"
#include "ui_widget.h"
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 点击获取 获取当前控件的值
connect(ui->pushButton,&QPushButton::clicked,[=](){
qDebug() << ui->widget->getNum();
});
// 设置到一半
connect(ui->pushButton_2,&QPushButton::clicked,[=](){
ui->widget->setNum(50);
});
}
Widget::~Widget()
{
delete ui;
}
#include "mylabel.h"
#include
#include
myLabel::myLabel(QWidget *parent)
: QLabel{parent}
{
// 设置鼠标追踪
setMouseTracking(true);
}
// 鼠标进入事件
void myLabel::enterEvent(QEvent *event)
{
qDebug()<< "鼠标进入了";
}
// 鼠标离开事件
void myLabel::leaveEvent(QEvent *event)
{
qDebug()<<"鼠标离开了";
}
// 鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
// if(ev->button() & Qt::LeftButton)
// {
qDebug()<< "鼠标移动";
// }
}
// 鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev)
{
if(ev->button() == Qt::LeftButton)
{
QString str = QString( "鼠标按下了x = %1 y = %2 globalX = %3 globalY = %4" ).arg(ev->x() ).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<< str;
}
}
// 鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev){
qDebug()<< "鼠标释放";
}
// 通过event事件分发器 拦截 鼠标按下事件
bool myLabel::event(QEvent *e)
{
// 如果是鼠标按下 在event事件分发中做拦截操作
if(e->type() == QEvent::MouseButtonPress)
{
// 静态类型转换
QMouseEvent * ev = static_cast(e);
QString str = QString( "event鼠标按下了x = %1 y = %2 globalX = %3 globalY = %4" ).arg(ev->x() ).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<< str;
return true; // true 代表用户自己处理这个事件 不向下分发
}
// 其他事件 交给父类处理 默认处理
return QLabel::event(e);
}
ev->button() 可以判断所有案件 Qt::LeftButton Qt::RightButton
ev->buttons()判断组合案件 判断move时候的左右键 结合& 操作符
mylabel.h
#ifndef MYLABEL_H
#define MYLABEL_H
#include
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
// 鼠标进入事件
void enterEvent(QEvent *event);
// 鼠标离开事件
void leaveEvent(QEvent *event);
// 鼠标移动
virtual void mouseMoveEvent(QMouseEvent *ev);
// 鼠标按下
virtual void mousePressEvent(QMouseEvent *ev);
// 鼠标释放
virtual void mouseReleaseEvent(QMouseEvent *ev);
// 通过event事件分发器 拦截 鼠标按下事件
bool event(QEvent *ev);
signals:
};
#endif // MYLABEL_H
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器
id1 = startTimer(1000); // 参数1 间隔 毫秒
id2 = startTimer(2000);
// 定时器第二种方式
QTimer * timer = new QTimer(this);
// 启动定时器
timer->start(500); // 0.5s
connect(timer,&QTimer::timeout,[=](){
static int num = 1;
// 每隔1s加一
ui->label_4->setText(QString::number(num++));
});
// 点击暂停按钮 实现停止定时器
connect(ui->pushButton,&QPushButton::clicked,[=]()
{
timer->stop();
});
// 给label1 安装事件过滤器
// 步骤1 安装事件过滤器
ui->label->installEventFilter(this);
}
// 步骤2 重写事件过滤器事件
bool Widget::eventFilter(QObject * obj, QEvent * e)
{
if(obj == ui->label)
{
if(e->type() == QEvent::MouseButtonPress)
{
// 静态类型转换
QMouseEvent * ev = static_cast(e);
QString str = QString( "事件过滤中,鼠标按下了x = %1 y = %2 globalX = %3 globalY = %4" ).arg(ev->x() ).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<< str;
return true; // true 代表用户自己处理这个事件 不向下分发
}
}
// 其他默认处理
return QWidget::eventFilter(obj,e);
}
// 重写定时器的事件
void Widget::timerEvent(QTimerEvent * ev)
{
if(ev->timerId() == id1)
{
static int num = 1;
// 每隔1s加一
ui->label_2->setText(QString::number(num++));
}
if(ev->timerId() == id2)
{
// 每隔2s +1
static int num2 = 1;
ui->label_3->setText(QString::number(num2++));
}
}
Widget::~Widget()
{
delete ui;
}
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
// 重写定时器的事件
void timerEvent(QTimerEvent *);
int id1;// 定时器1的唯一标识
int id2;// 定时器2的唯一标识
// 重写事件过滤器事件
bool eventFilter(QObject *, QEvent *);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
第一种定时器
利用事件 void timerEvent(QTimerEvent *ev)
启动定时器 startTimer(1000) 毫秒为单位
timerEvent 的返回值是定时器的唯一标识,可以和ev-> timerId做比较
第二种定时器
QTimer * timer = new QTimer(this);
timer->start(500);毫秒
timer->stop();
用途
bool event(QEvent *e);
返回值 如果是true代表用户处理这个事件, 不向下分发了
e->tyoe() === 鼠标按下
// 通过event事件分发器 拦截 鼠标按下事件
bool myLabel::event(QEvent *e)
{
// 如果是鼠标按下 在event事件分发中做拦截操作
if(e->type() == QEvent::MouseButtonPress)
{
// 静态类型转换
QMouseEvent * ev = static_cast(e);
QString str = QString( "event鼠标按下了x = %1 y = %2 globalX = %3 globalY = %4" ).arg(ev->x() ).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<< str;
return true; // true 代表用户自己处理这个事件 不向下分发
}
// 其他事件 交给父类处理 默认处理
return QLabel::event(e);
}
在程序将事件分发到事件分发器前,可以利用过滤器做拦截
步骤
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 启动定时器
id1 = startTimer(1000); // 参数1 间隔 毫秒
id2 = startTimer(2000);
// 定时器第二种方式
QTimer * timer = new QTimer(this);
// 启动定时器
timer->start(500); // 0.5s
connect(timer,&QTimer::timeout,[=](){
static int num = 1;
// 每隔1s加一
ui->label_4->setText(QString::number(num++));
});
// 点击暂停按钮 实现停止定时器
connect(ui->pushButton,&QPushButton::clicked,[=]()
{
timer->stop();
});
// 给label1 安装事件过滤器
// 步骤1 安装事件过滤器
ui->label->installEventFilter(this);
}
// 步骤2 重写事件过滤器事件
bool Widget::eventFilter(QObject * obj, QEvent * e)
{
if(obj == ui->label)
{
if(e->type() == QEvent::MouseButtonPress)
{
// 静态类型转换
QMouseEvent * ev = static_cast(e);
QString str = QString( "事件过滤中,鼠标按下了x = %1 y = %2 globalX = %3 globalY = %4" ).arg(ev->x() ).arg(ev->y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<< str;
return true; // true 代表用户自己处理这个事件 不向下分发
}
}
// 其他默认处理
return QWidget::eventFilter(obj,e);
}
QPainter绘画
绘图事件void paintEvent()
声明一个画家对象QPainter painter(this) this 指定绘图设备
画线、画圆、画矩形、画文字√
设嚣画笔QPen设置画笔宽度、风格
设置画刷QBrush设置画刷风格
// 绘图事件
void Widget::paintEvent(QPaintEvent *)
{
// 实例化画家对象 this指向的是绘图设备
QPainter painter(this);
//设置画笔
QPen pen(QColor(255,0,0));
// 设置画笔的宽度
pen.setWidth(3);
// 设置画笔的风格
pen.setStyle(Qt::DotLine);
// 设置画刷
QBrush brush(Qt::green);
// 设置画刷的 风格
brush.setStyle(Qt::Dense7Pattern);
// 让画家使用画刷
painter.setBrush(brush);
// 让画家 使用这个笔
painter.setPen(pen);
// 画直线
painter.drawLine(QPoint(0,0),QPoint(100,100));
// 画圆
painter.drawEllipse(QPoint(100,100),50,50);
// 画矩形
painter.drawRect(QRect(20,20,50,50));
// 画文字
painter.drawText(QRect(10,200,150,50),"好好学习,天天向上");
}
QPinter高级设置
//高级设置
QPainter painter(this);
// painter.drawEllipse(QPoint(100,50),50,50);
// // 设置抗锯齿能力 效率较低
// painter.setRenderHints(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.translate(100,0);
// 还原画家保存状态
painter.restore();
painter.drawRect(QRect(20,20,50,50));
手动调用绘画事件
painter.drawPixmap(posx,10,QPixmap(":/img/cat.jpg"));
绘图设备是指继承QPainterDevice,的子类。9t一共提供了四个这样的类,分别
是QPixmap、QBitmap.QImage和QPicture。其中,
QPixmap,专门为图像在屏幕上的显示做了优化
QBitmap,是 QPixmap,的一个子类,它的色深限定为1,可以使用QPixmap_的isQBitmap()函数来确定这个QPixmap,是不是一个
QBitmap。
QImage.专门为图像的像素级访凤做了优化。
QPicture则可以记录和重现 QPaintex的各条命令。
#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
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("路径");
// QImage 绘图设备 可以对像素进行访问
// QImage img(300,300,QImage::Format_ARGB32);
// img.fill(Qt::white);
// QPainter painter(&img);
// painter.setPen(QPen(Qt::green));
// painter.drawEllipse(QPoint(150,150),100,100);
// 保存
// img.save("路径");
//QPicture 绘图设备 可以记录和重新绘图指令
QPicture pic;
QPainter painter;
painter.begin(&pic); // 开始往pic 上画
painter.setPen(QPen(Qt::cyan));
painter.drawEllipse(QPoint(150,150),100,100);
painter.end();//结束画画
// 保存到磁盘
// pic.save("路径"); E:\\pic.zt
}
// 绘图事件
void Widget::paintEvent(QPaintEvent *)
{
// QPainter painter(this);
// // 利用Qimage 对像素进行修改
// QImage img;
img.load("路径");
// // 修改像素点
// for(int i = 50;i < 100;i++)
// {
// for(int j = 50; j < 100; j++)
// {
// QRgb value = qRgb(500,0,0);
// img.setPixel(i,j,value);
// }
// }
// painter.drawImage(0,0,img);
QPainter painter(this);
// 重现 QPicture的绘图指令
QPicture pic;
pic.load("E:\\pic.zt");
painter.drawPicture(0,0,pic);
}
Widget::~Widget()
{
delete ui;
}
QPixmap
QImage
QBitmap
(黑白色) QPicture
QWidger
QPixmap
对不同平台做了显示的优化
QPixmap pix(300,300)
pix.fill
(填充颜色) QPainter painter(&pix);
pix.save("路径");
QImage
可以对像素进行访问
QPixmap
,差不多Qlmage img(300,300,QlmageFormat_RGB32);
QPixmap
.一样img.setPixelii.value);
QPicture
记录和重现绘图指令
QPicture pic
painter.begin(&pic);-
pic.save(任意后缀名)
painter.drawPicture(o,0,pic);
QFile
进行读写操作QFile file( path文件路径)
file.creadAll()
按行读file.readLinel)atend()
判断是否读到文件尾utf-8
QTextcodec
QTextCodec * codec = QTextCodec…codecEorName("gbk");
ui->textEdit->setText( codec->toUnicode(array) );
close
file.open( QIODevice:writeOnly / Append)
file.write(内容)
file.close关闭
QFileInfo
文件信息的读取#include "widget.h"
#include "ui_widget.h"
#include
#include
#include
#include
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 点击选取文件按钮,弹出文件对话框
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString path = QFileDialog::getOpenFileName(this,"打开文件","E:\\dayFile");
// 将路径放入到lineEdit中
ui->lineEdit->setText(path);
// 编码格式类
QTextCodec * codec = QTextCodec::codecForName("gbk");
// 读取内容 放到textedit
// Qfile 默认支持的格式是 utf-8
QFile file(path); //参数就是读取文件的路径
//设置打开方式
file.open(QIODevice::ReadOnly);
QByteArray array;
// array = file.readAll();
while(!file.atEnd()){ // 判断是否读到文件尾部
array += file.readLine(); // 按行读
}
// 将读取到的数据 放入 textEdit中
ui->textEdit->setText(array);
// ui->textEdit->setText(codec->toUnicode(array));
// 对文件对象进行关闭
file.close();
// 进行写文件
file.open(QIODevice::Append); // 用追加的方式进行写
file.write("aaaa");
file.close();
// QFileInfo 文件信息读取
QFileInfo info(path);
qDebug()<< "大小" << info.size() << "后缀名" << info.suffix();
qDebug() << "创建日期" << info.created().toString("yyyy/MM/dd hh:mm:ss") ;
qDebug() << "最后的修改日期" << info.lastModified().toString("yyyy/MM/dd hh:mm:ss") ;
});
}
Widget::~Widget()
{
delete ui;
}
UI
界面上选择需要建立信号和槽连接的对象,例如按钮(pushButton
)。Go to Slo
t)。MainWindow
)中自动创建名为“on_objectName_signal
”的槽函数,其中objectName
是所选对象的名称,signal是所选的信号类型。MainWindow
类的“on_pushButton_clicked
”函数中设置pushButton
的文本为“clicked”。on_objName_signal
”,可以自动关联。首先要在
.pro文件中添加 network
QT += core gui network
#include
#include
#include
#include
#include
#include
void Login::on_regButton_clicked()
{
// 处理的动作
// 1. 从控件中取出用户输入的数据
QString userName = ui->reg_userName->text();
QString nickName = ui->reg_NickName->text();
QString passwd = ui->reg_passwd->text();
QString confirmPwd = ui->reg_confirmPwd->text();
QString email = ui->reg_mail->text();
QString phone = ui->reg_phone->text();
// 2. 数据校验
QRegExp regexp;
// 校验用户名,密码
QString USER_REG = "^[a-zA-Z0-9_@#-\\*]\\{3,16\\}$";
regexp.setPattern(USER_REG);
bool bl = regexp.exactMatch(userName);
if(bl == false)
{
QMessageBox::warning(this, "ERROR", "用户名格式不正确!");
return;
}
// regexp.setPattern();
// 3. 用户信息发送给服务器
// - 如何发送: 使用http协议发送, 使用post方式
// - 数据格式: json对象
QNetworkAccessManager* pManager = new QNetworkAccessManager(this);
QNetworkRequest request;
QString url = QString("http://%1:%2/reg").arg(ui->ip->text()).arg(ui->port->text());
request.setUrl(url);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); // 描述post数据的格式
// 将用户提交的数据拼接成功json对象字符串
/*
{
userName:xxxx,
nickName:xxx,
firstPwd:xxx,
phone:xxx,
email:xxx
}
*/
QJsonObject obj;
// insert(const QString &key, const QJsonValue &value)
obj.insert("userName", userName); // QJsonValue(userName)
obj.insert("nickName", nickName);
obj.insert("firstPwd", passwd);
obj.insert("phone", phone);
obj.insert("email", email);
// obj -> doc
QJsonDocument doc(obj);
// doc -> qbytearray
QByteArray json = doc.toJson();
QNetworkReply* reply = pManager->post(request, json);
// 4. 接收服务器发送的响应数据
connect(reply, &QNetworkReply::readyRead, this, [=](){
// 5. 对服务器响应进行分析处理, 成功or失败
// 5.1 接收数据 {"code":"003"}
QByteArray all = reply->readAll();
// 5.2 需要知道服务器往回发送的字符串的格式 -> 解析
// qbytearray -> doc
QJsonDocument doc = QJsonDocument::fromJson(all);
// doc -> obj
QJsonObject myobj = doc.object();
QString status = myobj.value("code").toString();
// 5.3 判读成功, 失败, 给用户提示
if("002" == status)
{
// 成功
}
else if("003" == status)
{
// 用户已经存在
}
else
{
// 失败
}
});
}