效果:按钮弹出分屏选择
#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
#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);
}
#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;
};
#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();
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;
}
}