题目列表:
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作为"画布",自定义提升**
单击正方形,从队列末开始比较鼠标坐标。将选中的目标,移到队列末,其之后的元素向前移一位。
其余:文件操作,各类事件重构。