QT-widget窗体初窥

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();//执行消息循环
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值