QT分屏按钮

14 篇文章 1 订阅
13 篇文章 0 订阅

效果:按钮弹出分屏选择

QT分屏按钮

// gridpopwidget.h
#ifndef GRIDPOPWIDGET_H
#define GRIDPOPWIDGET_H

#include <QWidget>
#include <QMouseEvent>

class GridPopWidget : public QWidget
{
    Q_OBJECT
public:
    explicit GridPopWidget(QWidget *parent = nullptr);

protected:
    void paintEvent(QPaintEvent *) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;

signals:
    void sig_layout(int, int);

private:
    int row{0};
    int col{0};
};

#endif // GRIDPOPWIDGET_H
// gridpopwidget.cpp
#include "gridpopwidget.h"
#include <QPainter>

#define  GRIDROW    4
#define  GRIDCOL    5
#define  GRIDSIZE  25
#define  GRIDSPACE  0
GridPopWidget::GridPopWidget(QWidget *parent): QWidget{parent}
{
    setMouseTracking(true);
    setFixedSize(1 + GRIDSIZE * GRIDCOL, 1 + GRIDSIZE * GRIDCOL);
    this->hide();
}

void GridPopWidget::paintEvent(QPaintEvent *)
{
    int win_width = geometry().width();
    int win_height = geometry().height();

    QPainter painter(this);
    for (int x = 0; x < win_width; x += GRIDSIZE)
        painter.drawLine(QPoint(x, 1), QPoint(x, win_height));

    for (int y = 0; y < win_height; y += GRIDSIZE)
        painter.drawLine(QPoint(1, y), QPoint(win_width, y));
    if (!row || !col)
        return;

    painter.setPen(Qt::NoPen);
    painter.setBrush(QBrush(QColor(120, 120, 120, 80)));
    painter.drawRect(QRect(QPoint(0, 0), QPoint(row * GRIDSIZE - 1, col * GRIDSIZE - 1)));
}

void GridPopWidget::mouseMoveEvent(QMouseEvent *e)
{
    row = qCeil(e->pos().x() * 1.0 / GRIDSIZE);
    col = qCeil(e->pos().y() * 1.0 / GRIDSIZE);
    update();
    QWidget::mouseMoveEvent(e);
}

void GridPopWidget::mousePressEvent(QMouseEvent *e)
{
    emit sig_layout(row, col);
    this->hide();
    QWidget::mousePressEvent(e);
}
// mainwindow.ui
// 拖动一个 QToolButton
// mainwindow.h
#include <gridpopwidget.h>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
protected:
    virtual void mousePressEvent(QMouseEvent *event) override;
    virtual void resizeEvent(QResizeEvent *event) override;
public slots:
    void setSplitLayout(int row,int col);
    void setGridPopWidget();
private:
    void resetLayout();
private:
    GridPopWidget    *gridwidget;
}
// mainwindow.cpp
#include <QToolButton>
#include <QMenu>
#include <QComboBox>
MainWindow::MainWindow(QWidget *parent)
{
    gridwidget = new GridPopWidget(this); ui->statusbar->addPermanentWidget(ui->toolButton);
    connect(gridwidget,&GridPopWidget::sig_layout,this,&MainWindow::setSplitLayout);
    connect(ui->toolButton,&QToolButton::clicked,this,&MainWindow::setGridPopWidget);
}

void MainWindow::resizeEvent(QResizeEvent *e)
{
   if(gridwidget->isVisible())
		gridwidget->hide();
}

void MainWindow::mousePressEvent(QMouseEvent *e)
{
   if( e->pos().x() < gridwidget->pos().x() || 
       e->pos().y() < gridwidget->pos().y() )
   {
       gridwidget->hide();
   }
}

void MainWindow::setSplitLayout(int row, int col)
{  // 具体实现分屏
    if(!row || !col) return;

    resetLayout();
    //new layout
    QGridLayout* gLayout = new QGridLayout(ui->centralwidget);
    gLayout->setSpacing(2);
    for (int i = 0;i < row; ++i) {
        for (int j = 0;j < col; ++j)
            gLayout->addWidget(new QLabel(QString("%1-%2").arg(i+1).arg(j+1),this),i,j);
    }
    ui->centralwidget->setLayout(gLayout);
}

void MainWindow::setGridPopWidget()
{
   gridwidget->move(width()-gridwidget->width(),
                    height()-gridwidget->height()-ui->statusbar->height()+5);
   gridwidget->show();
}

void MainWindow::resetLayout()
{
    QLayout* layout = ui->centralwidget->layout();
    if (layout) {
        QLayoutItem* child;
        while((child = layout->takeAt(0)) != 0) {
            if (child->widget()) {
                child->widget()->setParent(NULL);
            }
            delete child;
        }
        delete layout;
    }
}
本课程详细、全面地介绍了 Qt 开发中的各个技术细节,并且额外赠送在嵌入式端编写Qt程序的技巧。整个课程涵盖知识点非常多,知识模块囊括 Qt-Core 组件、QWidgets、多媒体、网络、绘图、数据库,超过200个 C++ 类的分析和使用,学完之后将拥有 Qt 图形界面开发的非常坚实的功底。 每个知识点不仅仅会通过视频讲解清楚,并且会配以精心安排的实验和作业,用来保证学习过程中切实掌握核心技术和概念,通过实验来巩固,通过实验来检验,实验与作业的目的是发现问题,发现技术盲点,通过答疑和沟通夯实技术技能。注意:本套视频教程来源于线下的实体班级,因此视频中有少量场景对话和学生问答,对此比较介意的亲们谨慎购买。注意:本套视频教程包含大量课堂源码,包含对应每个知识点的精心编排的作业。由于CSDN官方规定在课程介绍中不能出现作者的联系方式,因此在这里无法直接给出QQ答疑号,视频中的源码、资料和作业文档链接统一在购买后从CSDN平台跟我沟通,我会及时回复跟进。注意:本套视频教程包含全套10套作业题,覆盖所有视频知识点,循序渐进,各个击破,作业总纲如下:下面是部分作业题目展示,每道题都有知识点说明,是检验学习效果的一大利器:(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)(部分作业展示,为了防止盗图盗题对题干做了模糊处理)…… ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值