1-主要就是一些 事件重写 和最基本的 控件设置
2-创建一个widget类 在main函数中实现
#include <QWidget>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
///大小事件
void resizeEvent(QResizeEvent *event);
///关闭事件
void closeEvent(QCloseEvent *event);
///键盘事件
void keyPressEvent(QKeyEvent *event); //键盘按下事件
void keyReleaseEvent(QKeyEvent *event);//键盘松开事件
///鼠标事件
void mousePressEvent(QMouseEvent *event) override; //按下鼠标事件
void mouseReleaseEvent(QMouseEvent *event) override; //释放鼠标事件
void mouseMoveEvent(QMouseEvent *event) override; //移动鼠标事件
void mouseDoubleClickEvent(QMouseEvent *event) override;//双击鼠标事件
void wheelEvent(QWheelEvent* event);//鼠标滚轮事件
///重绘事件
void paintEvent(QPaintEvent *event) override; //重绘事件
};
---------------以上是创建一个widget类的头文件---以下是实现widget的源文件------------------
#include "widget.h"
#include <QDebug>
#include <QPalette>
#include <QPainter>
#include <QMouseEvent>
#include <QKeyEvent>
#include <QMessageBox>
#include <QResizeEvent>
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPalette pal;
pal.setColor(QPalette::Normal,QPalette::Background,QColor(0,255,0));//背景色 绿色
pal.setColor(QPalette::Normal,QPalette::Foreground,QColor(255,0,0));//前景色 红色
this->setPalette(pal);
///模态
QWidget* push=new QWidget();//普通窗口
push->resize(200,250);
push->setWindowModality(Qt::WindowModal);//没有父类 所以不会阻塞窗口
push->show();
QPushButton* button=new QPushButton(this);
button->setText("pushbutton");
button->setVisible(true);
connect(button,&QPushButton::clicked,[this](){
QWidget* push=new QWidget(this,Qt::Window);//要想模态效果,必须指定父窗口(this,Qt::Window)
push->resize(200,250);
push->setWindowModality(Qt::WindowModal); //阻塞父窗口 及其 祖父兄弟类窗口
//push->setWindowModality(Qt::ApplicationModal); //阻塞全部窗口
push->show();
});
}
Widget::~Widget()
{
}
void Widget::resizeEvent(QResizeEvent *event)
{
qDebug()<<"resizeEvent"<<event->oldSize()<<"=>"<<event->size();
//第一次oldSize会是 -1,-1
//应用场景 随着父窗口的大小可以 获取数值改变 子窗口的大小
}
void Widget::closeEvent(QCloseEvent *event)
{
Q_UNUSED(event);
// if(QMessageBox::question(this,"提示","您真的要关闭吗")!=QMessageBox::Yes)
// {
// event->ignore();//阻止窗口处理关闭事件
// }
qDebug()<<"closeEvent";
}
void Widget::keyPressEvent(QKeyEvent *event)
{
//1-按下的是哪一个键
//2-有没有按下修饰键 ctrl alt shift meta(win)
qDebug()<<"keyPressEvent:"<<event->key()<<":"<<event->text()
<<"修饰键:"<<event->modifiers();
}
void Widget::keyReleaseEvent(QKeyEvent *event)
{
qDebug()<<"keyPressEvent:"<<event->key()<<":"<<event->text()
<<"修饰键:"<<event->modifiers();
}
void Widget::mousePressEvent(QMouseEvent *event)
{
Q_UNUSED(event);//抑制未使用参数的警告
qDebug()<<"mousePressEvent:"<<this<<" "
<<"pos:"<<event->pos()<<" "
<<"globalPos:"<<event->globalPos()<<" "
<<"button:"<<event->button()<<" "
<<"buttons:"<<event->buttons()<<" ";
}
void Widget::mouseReleaseEvent(QMouseEvent *event)
{
Q_UNUSED(event);//抑制未使用参数的警告
qDebug()<<"mouseReleaseEvent:"<<this<<" "
<<"pos:"<<event->pos()<<" "
<<"globalPos:"<<event->globalPos()<<" "
<<"button:"<<event->button()<<" "
<<"buttons:"<<event->buttons()<<" "
;
//close();
}
void Widget::mouseMoveEvent(QMouseEvent *event)
{
Q_UNUSED(event);//抑制未使用参数的警告
///在指定窗体设置w.setMouseTracking(true);//true只要鼠标划过就会产生鼠标事件,不需要点击
qDebug()<<"mouseMoveEvent:"<<this<<" "
<<"pos:"<<event->pos()<<" "
<<"globalPos:"<<event->globalPos()<<" "
<<"button:"<<event->button()<<" "
<<"buttons:"<<event->buttons()<<" ";
}
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{
Q_UNUSED(event);//抑制未使用参数的警告
qDebug()<<"mouseDoubleClickEvent:"<<this<<" "
<<"pos:"<<event->pos()<<" "
<<"globalPos:"<<event->globalPos()<<" "
<<"button:"<<event->button()<<" "
<<"buttons:"<<event->buttons()<<" ";
}
void Widget::wheelEvent(QWheelEvent *event)
{
qDebug()<<"wheelEvent:"<<event->angleDelta()<<":"
<<(event->angleDelta().y()>0?"正向滚动":"负向滚动");
//用户滚动鼠标,产生wheelEvent事件
//angleDelta().y() 总是大于0 或者 小于0;(一般鼠标120° or -120° 对于特殊高精度鼠标可能有变化)
//基于以上可以判断鼠标 向上滚动 还是 向下滚动
}
void Widget::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);//抑制未使用参数的警告
QPainter p(this);
p.drawText(30,30,"SSSSSSSSSSSSSSSSSSSSS");
}
main 实现
/*
* 1-什么是窗口 并不是所有Qwidget都是窗口
* 2-父窗体与子窗体的嵌套
* 3-给一个窗口加悬浮提示
* 4-widget中代码
* 0>模态:当前窗口阻塞父类窗口
* 1>窗口大小事件resizeEvent
* 2>窗口关闭事件closeEvent
* 3>键盘事件 keyPressEvent按下事件 keyReleaseEvent释放事件
* 4>鼠标事件 mousePressEvent 按下事件 mouseReleaseEvent 释放事件
* mouseMoveEvent 移动事件 mouseDoubleClickEvent 双击事件
* wheelEvent 滚轮事件
* 5>重绘事件 paintEvent
*
*/
#include "widget.h"
#include <QApplication>
#include <QDebug>
#include <QPalette>
void set_color(QWidget* qw,QColor color=QColor(0,0,255))//
{
QPalette p;
p.setColor(QPalette::Normal,QPalette::Background,color);
p.setColor(QPalette::Normal,QPalette::Foreground,QColor(255,0,0));
qw->setPalette(p);
qw->setAutoFillBackground(true);//自动绘制背景 不写的话不会显示窗口颜色
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
//设置为可见的
//w.setVisible(true);
w.show();
w.setGeometry(100,120,300,200);
w.resize(800,600);
//w.hide(); //隐藏窗口
//w.setEnabled(false);//不可用状态,点击事件全部失效
w.setMouseTracking(false);//true只要鼠标划过就会产生鼠标事件
#if 0
//创建一个新的主窗口 QWidget* qw=new QWidget(); 主窗口:Primary window
QWidget* qw=new QWidget(&w,Qt::Window);//创建一个 窗口 属性是 window (没有自己的独立的程序图标)
qw->setGeometry(50,50,300,200); //但是可以独立的移动
qw->setVisible(true);
#endif
#if 0
//创建的子窗口 或者 叫控件
QWidget* qw=new QWidget(&w); //放到上一级父窗口
set_color(qw);
qw->setGeometry(100,100,300,300);
//qw->setGeometry(w.width()/2,w.height()/2,300,300);
qw->setVisible(true);
qw->setToolTip("--qw--"); //鼠标悬浮提示
qw->setToolTipDuration(2000); //显示时间
//子窗口嵌套
QWidget* qw1=new QWidget(qw); //放到上一级父窗口
set_color(qw1,QColor(100,100,100));
qw1->setGeometry(100,100,300,300);
qw1->setVisible(true);
qw1->setToolTip("--qw1--"); //鼠标悬浮提示
//子窗口嵌套
QWidget* qw2=new QWidget(qw1);//放到上一级父窗口
set_color(qw2,QColor(50,50,50));
qw2->setGeometry(100,100,200,200);
qw2->setVisible(true);
qw2->setToolTip("--qw2--"); //鼠标悬浮提示
#endif
return a.exec();//执行消息循环
}