通过按钮点击事件画圆,画矩形.
在Qt开发中,信号和槽是经常需要使用到的,尤其在按键与窗体交互的时候。
型号类型有click,press等等等
槽函数是自己定义的一个为了实现某些功能的函数,我们一般在关联某个控件,通过某种信号实现控件与函数功能的连接。在ui界面下可以直接通过转到槽来实现这一功能。也可以自己手写来实现。
手写代码步骤如下:
在mainwindow的构造函数中使用
connect(控件名,SIGNAL(触发方式),this,SLOT(槽函数));
connect(sender,SIGNAL(signal()),receiver,SLOT(slot()));
在头文件下的slot 中对函数进行声明
在.cpp文件中对函数进行实现
void paintEvent(QPaintEvent *);
画图事件,随着程序的持续一直在运行直到程序结束,才结束
QPushButton按钮的创建有两种方式,一种是纯代码的方式实现,还有一种就是通过ui界面去完成,这里使用代码创建,如下
QPushButton * btn = new QPushButton(this);
btn->setText(tr("正方形")); //设置文本
btn->move(100,200); //设置按钮位置
通过按钮实现点击画图事件,这里需要给paintEvent事件中设置一个状态值,通过这个状态值来实现图形的变化,所以我们这里画圆,画矩形的函数,在paintEvent中实现,通过槽函数更改状态值,实现我们按钮图形显示。.
status = 0;
enum {
RECT,CIRCLE
};
主要的思路已经描述完 这里开始进行代码的展示:
头文件如下:
//#include "mainwindow.h"
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPaintEvent>
#include <QPushButton>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
protected:
void set_button(); //按键函数
void Connect(); //信号函数
void paintEvent(QPaintEvent *);
private slots:
void draw_rect();
void draw_circle();
void clear();
private:
Ui::MainWindow *ui;
QPushButton* btn_rect;
QPushButton* btn_circle;
QPushButton* btn_clear;
int status;
enum{
rect=1,
circle,
empty
};
};
#endif // MAINWINDOW_H
.cpp文件如下
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
set_button();
Connect();
pix = QPixmap(200,200);
pix.fill(Qt::white);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::set_button()
{
resize(600,800);
//新建按钮对象
btn_rect = new QPushButton(this);
//设置按钮显示文本
btn_rect->setText(tr("正方形"));
//设置按钮放置位置
btn_rect->move(450, 500);
btn_circle = new QPushButton(this);
btn_circle->setText(tr("圆形"));
btn_circle->move(450, 580);
btn_tangle = new QPushButton(this);
//设置按钮显示文本
btn_tangle->setText(tr("五角星"));
//设置按钮放置位置
btn_tangle->move(450, 660);
btn_clear = new QPushButton(this);
btn_clear->setText(tr("清空"));
btn_clear->move(450,740);
}
void MainWindow::paintEvent(QPaintEvent *)
{
update();
QPainter painter(this);
QPen pen; //画笔
pen.setColor(QColor(255, 0, 0));
QBrush brush(QColor(0, 255, 0, 125)); //画刷
painter.setBrush(brush); //添加画刷
if(status == rect)
{
painter.drawRect(100, 200, 200, 100); //绘制矩形
}
if(status == circle)
{
QRectF rectangle(100.0,200.0,80.0,60.0);
// painter.drawEllipse(rectangle);
painter.drawEllipse(100.0,200.0,200.0,160.0);
}
if(status == empty)
{
update();
}
}
void MainWindow::draw_rect()
{
status = rect;
}
void MainWindow::draw_circle()
{
status = circle;
}
void MainWindow::draw_tangle()
{
status = tangle;
}
void MainWindow::clear()
{
status = empty;
}
void MainWindow::Connect()
{
connect(btn_rect,SIGNAL(clicked()),this,SLOT(draw_rect()));
connect(btn_circle,SIGNAL(clicked()),this,SLOT(draw_circle()));
connect(btn_tangle,SIGNAL(clicked()),this,SLOT(draw_tangle()));
connect(btn_clear,SIGNAL(clicked()),this,SLOT(clear()));
}
这里主要是对于信号和槽函数的实践,没有加太多关于图形的算法,画圆和画矩形都是调用的Qt库里面的函数,然后加入update()函数,实现了一个清屏的功能。