QT 信号和槽函数的应用

通过按钮点击事件画圆,画矩形.

在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()函数,实现了一个清屏的功能。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值