2020清华计算机大一下学期考试(QT正方形大师)

题目列表:
在这里插入图片描述
在这里插入图片描述


1.正方形大师

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}
//仅使用了几个槽函数,头文件略
void MainWindow::on_SaveMenu_triggered()
{
    ui->widget->Save();
}

void MainWindow::on_ClearMenu_triggered()
{
    ui->widget->Clear();
}

void MainWindow::on_OpenMenu_triggered()
{
    ui->widget->Open();
}

void MainWindow::on_ExitMenu_triggered()
{
    close();
}


SquareWidget.h

#ifndef SQUAREWIDGET_H
#define SQUAREWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
//如果只定义指针变量,可节省编译时间
QT_END_NAMESPACE

class SquareWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SquareWidget(QWidget *parent = nullptr);
    int Count  = 0;//最多6个
    int MouseX = 0;//鼠标坐标
    int MouseY = 0;//鼠标坐标
    QRectF SquareList[6];//正方形数量
    bool Commit = false;//选中标志位

    void Open();
    void Save();
    void Clear();
signals:

public slots:

private:
    QRectF SquereSize;//正方形尺寸
    QRectF TempSquere;//被选中的位置

protected:
    void mouseDoubleClickEvent(QMouseEvent *ev);
    void mousePressEvent(QMouseEvent *ev);
    void mouseMoveEvent(QMouseEvent *ev);
    void paintEvent(QPaintEvent *event);
    void keyPressEvent(QKeyEvent *ev);

};
#endif // SQUAREWIDGET_H

SquareWidget.cpp

#include "squarewidget.h"
#include <QMouseEvent>
#include <QDebug>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QFile>
#include <QFileDialog>

#define cout qDebug() << "[" << __FILE__ << ":" << __LINE__ << "]"

SquareWidget::SquareWidget(QWidget *parent) : QWidget(parent)
{
    this->setMouseTracking(true);
    //单击获取焦点
    this->setFocusPolicy(Qt::ClickFocus);
    //获取焦点,才能使用键盘事件
    //this->grabKeyboard();
}

void SquareWidget::mouseMoveEvent(QMouseEvent *ev)
{
    MouseX = ev->x();
    MouseY = ev->y();
    if(ev->buttons() == Qt::LeftButton)
    {
        //有被选中的目标
        if(Commit)
        {
            qreal height = SquareList[Count-1].height();
            qreal width = SquareList[Count-1].width();
            SquareList[Count -1].setRect(MouseX-width/2,MouseY-height/2,width,height);
            this->update();
        }
    }
}

void SquareWidget::mouseDoubleClickEvent(QMouseEvent *ev)
{
    if(ev->buttons() == (Qt::LeftButton | Qt::LeftButton))
    {
        cout << "左键双击";
        if(Count < 6)
        {
            Commit = false;
            SquereSize = QRectF(MouseX-50/2,MouseY-50/2,50,50);
            SquareList[Count] = SquereSize;
            Count++;
            this->update();
        }
        cout << Count;
    }
}

void SquareWidget::paintEvent(QPaintEvent *ev)
{
    cout << "重绘";
    Q_UNUSED(ev);
    QPainter Painter(this);

    QPen Pen;
    Pen.setWidth(2);
    QPen Pen1;
    Pen1.setWidth(2);
    Pen1.setColor(Qt::red);

    QBrush Brush;
    Brush.setStyle(Qt::SolidPattern);
    Brush.setColor(Qt::blue);

    QBrush Brush1;
    Brush1.setStyle(Qt::SolidPattern);
    Brush1.setColor(Qt::green);

    for(int i = 0;i < Count; i++)
    {
        if(i == Count -1 && Commit)
        {
            Painter.setPen(Pen1);
            Painter.setBrush(Brush1);
            Painter.drawRect(SquareList[i]);
        }
        else
        {
            Painter.setPen(Pen);
            Painter.setBrush(Brush);
            Painter.drawRect(SquareList[i]);
        }
    }
}

void SquareWidget::mousePressEvent(QMouseEvent *ev)
{
    cout << "键盘";
    if(ev->buttons() == Qt::LeftButton)
    {
        for(int i = Count-1; i >= 0 ;i--)
        {
            if((MouseX >= SquareList[i].topLeft().x()) && (MouseY >= SquareList[i].topLeft().y())
                    && (MouseX <= SquareList[i].bottomRight().x()) && (MouseY <=SquareList[i].bottomRight().y()))
            {
                Commit = true;
                //被选中的拿出来,放到目前队列最后,其之后的正方形往前进一格
                if(i != Count-1)
                {
                    TempSquere = SquareList[i];
                    for(int j = i ; j < Count ;j++)
                    {
                        SquareList[j] = SquareList[j+1];
                    }
                    SquareList[Count-1] = TempSquere;
                    this->update();
                    break;
                }
                //本就是最上层
                else
                {
                    this->update();
                    break;
                }
            }
            else//啥都没点到
            {
                Commit = false;
                this->update();
            }
        }
    }

    if(ev->buttons() == Qt::RightButton)
    {
        Commit = false;
        this->update();
    }
}

void SquareWidget::keyPressEvent(QKeyEvent *ev)
{
    cout << "左键";
    if(Commit == true)
    {
        if(ev->key() == Qt::Key_Up)
        {
            qreal newX = SquareList[Count - 1].x();
            qreal newY = SquareList[Count - 1].y() - 30;
            SquareList[Count-1].setRect(newX,newY,50,50);
            this->update();
        }

        if(ev->key() == Qt::Key_Down)
        {
            qreal newX = SquareList[Count - 1].x();
            qreal newY = SquareList[Count - 1].y() + 30;
            SquareList[Count-1].setRect(newX,newY,50,50);
            this->update();
        }

        if(ev->key() == Qt::Key_Left)
        {
            qreal newX = SquareList[Count - 1].x() - 30;
            qreal newY = SquareList[Count - 1].y();
            SquareList[Count-1].setRect(newX,newY,50,50);
            this->update();
        }

        if(ev->key() == Qt::Key_Right)
        {
            qreal newX = SquareList[Count - 1].x() + 30;
            qreal newY = SquareList[Count - 1].y();
            SquareList[Count-1].setRect(newX,newY,50,50);
            this->update();
        }
    }
    else
    {
        SquareWidget::keyPressEvent(ev);
    }
}

void SquareWidget::Open()
{
    cout << "打开";
    emit Clear();
    QString FilePath = QFileDialog::getOpenFileName(this,"OPEN","/","Word(*.txt)");

    QFile ReadFile(FilePath);
    ReadFile.open(QIODevice::ReadOnly);
    QString Filetxt;
    QStringList SquereTxtList;
    if(ReadFile.isOpen())
    {
        while(ReadFile.atEnd() == false)
        {
            Filetxt = QString(ReadFile.readLine(1000));
            //除去换行符
            SquereTxtList << Filetxt.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
        }
        //QString.size()队列个数,赋值
        for(int i = 0 ; i < SquereTxtList.size();i++)
        {
            SquareList[i].setX(SquereTxtList[i].section(',',1,1).toInt());
            SquareList[i].setY(SquereTxtList[i].section(',',2,2).toInt());
            SquareList[i].setWidth(SquereTxtList[i].section(',',3,3).toInt());
            SquareList[i].setHeight(SquereTxtList[i].section(',',4,4).toInt());
        }
        Count = SquereTxtList.size();

        this->update();
        ReadFile.close();
    }
    else
    {
        cout << "文件打开失败";
        return;
    }
}

void SquareWidget::Save()
{
    cout << "保存";
    QString FilePath = QFileDialog::getSaveFileName(this,"Save","/","Word(*.txt)");
    if(FilePath.isNull())
    {
        cout << "文件路径获取失败";
        return;
    }
    else
    {
        QFile File(FilePath);
        File.open(QIODevice::WriteOnly);
        if(File.isOpen())
        {
            QString Info;
            for(int i = 0; i < Count;i++)
            {
                Info += QString("%1,%2,%3,%4,%5\n").arg(i).arg(SquareList[i].x()).arg(SquareList[i].y())
                                                                  .arg(SquareList[i].height()).arg(SquareList[i].width());
            }
            File.write(Info.toUtf8());
            File.close();
        }
        else
        {
            cout << "文件打开失败";
            return;
        }
    }
}

void SquareWidget::Clear()
{
    cout << "清空";
    for(int i = 0;i < 6;i++)
    {
        Count = 0;
        Commit =false;
        SquareList[i].setRect(0,0,0,0);
    }
    this->update();
}
	**新建继承于QWidget的SquareWidget作为"画布",自定义提升**
	
	单击正方形,从队列末开始比较鼠标坐标。将选中的目标,移到队列末,其之后的元素向前移一位。
	其余:文件操作,各类事件重构。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值