当前位置: 首页 > news >正文

Qt C++简单图形界面与绘图实验

一、实验目的和要求

1、掌握Qt中掌握绘图工具和图形界面设计;绘制常见的图形。

2、熟悉Qt界面设计中常用的控件。

3、了解滚动条、滑动条、进度条、旋转按钮控件的用法。

二、实验内容

1、设计一个绘图软件,完成图像的绘制操作。

2、建立按钮的信号与槽函数,实现点击按钮进行相应文件操作。

3、利用滚动条、滑动条、进度条、旋转按钮控件完成绘图相关操作。

三、实验步骤

1、新建工程,选择Qt Widgets Applocation选项,工程名称为draw_test,类名设置为MainWidget继承的父类为Qwidget。

3、双击打开mainwdget.ui文件,打开界面设计,分别使用鼠标拖放一个Push Button、一个QScrollBar控件、一个QSlider控件、一个QProgressBar控件、四个QRadioButton控件,并将QScrollBar控件名称修改为scrollBar,QSlider控件名称修改为slider,QProgressBar控件名称修改为progressBar, QRadioButton控件名称分别修改为rectButton、circleButton、lineButton、curveButton,按钮文本分别修改为“矩形、圆形、直线及直线”。Button控件名称修改为resetButton,按钮文本分别修改为“重置”

4、鼠标选中resetButton两个按钮,右键菜单选择转到槽,选择clicked()信号;选中slider、progressBar、scrollBar三个控件,右键菜单选择转到槽,选择valueChanged 信号

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H#include <QWidget>
#include <QPainter>
#include <QColor>namespace Ui {
class MainWidget;
}class MainWidget : public QWidget
{Q_OBJECTpublic:explicit MainWidget(QWidget *parent = nullptr);~MainWidget();protected:void paintEvent(QPaintEvent *event) override; // 重绘事件private slots:void onShapeChanged(); // 形状改变槽函数void on_resetButton_clicked(); // 重置按钮槽函数void on_slider_valueChanged(int value); // 滑块值改变槽函数void on_progressBar_valueChanged(int value); // 进度条值改变槽函数void on_scrollBar_valueChanged(int value); // 滚动条值改变槽函数void on_colorButton_clicked(); // 颜色按钮槽函数private:void drawShape(QPainter &painter); // 绘制图形函数Ui::MainWidget *ui;int shapeType; // 当前图形类型 (0:矩形, 1:圆形, 2:直线, 3:曲线)int progressValue; // 进度条值int shapeSize; // 图形大小int scrollOffset; // 滚动偏移量QColor shapeColor; // 图形颜色
};#endif // MAINWIDGET_H

mainwidge.ccp

#include "mainwidget.h"
#include "ui_mainwidget.h"#include <QVBoxLayout>
#include <QGroupBox>
#include <QPushButton>
#include <QMessageBox>
#include <QColorDialog>
#include <QDebug>MainWidget::MainWidget(QWidget *parent): QWidget(parent), ui(new Ui::MainWidget), shapeType(0) // 默认绘制矩形, progressValue(0) // 进度条初始值, shapeSize(100) // 默认形状大小, scrollOffset(0) // 滚动偏移量初始化为0, shapeColor(Qt::black) // 默认颜色为黑色
{ui->setupUi(this);// 连接单选按钮的toggled信号到onShapeChanged槽connect(ui->rectButton, &QRadioButton::toggled, this, &MainWidget::onShapeChanged);connect(ui->circleButton, &QRadioButton::toggled, this, &MainWidget::onShapeChanged);connect(ui->lineButton, &QRadioButton::toggled, this, &MainWidget::onShapeChanged);connect(ui->curveButton, &QRadioButton::toggled, this, &MainWidget::onShapeChanged);// 设置默认选中的按钮ui->rectButton->setChecked(true);
}MainWidget::~MainWidget()
{delete ui;
}void MainWidget::onShapeChanged()
{// 根据选中的单选按钮更新图形类型if (ui->rectButton->isChecked()) {shapeType = 0; // 矩形} else if (ui->circleButton->isChecked()) {shapeType = 1; // 圆形} else if (ui->lineButton->isChecked()) {shapeType = 2; // 直线} else if (ui->curveButton->isChecked()) {shapeType = 3; // 曲线}update(); // 触发重绘事件
}void MainWidget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event); // 避免未使用参数的警告QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿// 设置画笔颜色painter.setPen(shapeColor);// 计算形状的起始位置int x = (width() - shapeSize) / 2;int y = (height() - shapeSize) / 2;// 平移坐标系到中心位置painter.translate(x, y);// 绘制选定的形状drawShape(painter);
}void MainWidget::drawShape(QPainter &painter)
{switch (shapeType) {case 0: // 绘制矩形painter.drawRect(0, 0, shapeSize, shapeSize);break;case 1: // 绘制圆形painter.drawEllipse(0, 0, shapeSize, shapeSize);break;case 2: // 绘制直线painter.drawLine(0, 0, shapeSize, shapeSize);break;case 3: // 绘制曲线painter.drawArc(0, 0, shapeSize, shapeSize, 0, 90 * 16); // 绘制90度弧线break;}
}void MainWidget::on_resetButton_clicked()
{// 重置所有控件到初始状态ui->slider->setValue(100); // 滑块重置为100ui->progressBar->setValue(0); // 进度条重置为0ui->scrollBar->setValue(0); // 滚动条重置为0shapeType = 0; // 重置为矩形shapeSize = 100; // 重置图形大小shapeColor = Qt::black; // 重置颜色为黑色ui->rectButton->setChecked(true); // 选中矩形按钮update(); // 刷新界面
}void MainWidget::on_slider_valueChanged(int value)
{shapeSize = value; // 更新图形大小update(); // 刷新界面
}void MainWidget::on_progressBar_valueChanged(int value)
{progressValue = value; // 更新进度条值ui->progressBar->setValue(progressValue); // 设置进度条值
}void MainWidget::on_scrollBar_valueChanged(int value)
{progressValue = value; // 更新进度条值ui->progressBar->setValue(progressValue); // 设置进度条值
}void MainWidget::on_colorButton_clicked()
{// 打开颜色对话框,让用户选择颜色QColor color = QColorDialog::getColor(shapeColor, this, "选择图形颜色");if (color.isValid()) { // 如果用户选择了有效颜色shapeColor = color; // 更新图形颜色update(); // 刷新界面}
}

运行结果

四、问题讨论

1、分析不同控件的作用、功能和用法。

2、分析Qt中绘图类的使用。

1、分析不同控件的作用、功能和用法。

1. QRadioButton(单选按钮)

作用:提供互斥选择,用于在多个选项中选择一个
功能:

  • isChecked() 检查是否被选中
  • setChecked(true/false) 设置选中状态
  • toggled(bool) 信号在状态改变时触发

用法:

// 创建并连接信号

QRadioButton *rectBtn = new QRadioButton("矩形");

connect(rectBtn, &QRadioButton::toggled, this, &MainWidget::onShapeChanged);

// 判断选中状态

if(ui->rectButton->isChecked()){ /*...*/ }

QSlider(滑块)

作用:通过滑动选择数值范围
功能:

  • setRange(min,max) 设置取值范围
  • value() 获取当前值
  • valueChanged(int) 信号在值变化时触发

用法:

// 初始化设置

ui->slider->setRange(10, 200);  // 大小范围10-200

ui->slider->setValue(100);      // 初始值

// 连接信号

connect(ui->slider, &QSlider::valueChanged, this, &MainWidget::on_slider_valueChanged);

QScrollBar(滚动条)

作用:提供数值滚动调节功能
功能:

  • 与QSlider类似,但外观和交互方式不同
  • 常用于内容区域滚动

用法:

ui->scrollBar->setRange(0, 100);

connect(ui->scrollBar, &QScrollBar::valueChanged,

        this, &MainWidget::on_scrollBar_valueChanged);

QProgressBar(进度条)

作用:显示操作进度
功能:

  • setValue(int) 设置当前进度
  • setRange(min,max) 设置范围
  • 支持水平/垂直方向

用法:

ui->progressBar->setRange(0, 100);

ui->progressBar->setValue(50);  // 显示50%进度

QPushButton(普通按钮)

作用:触发操作命令
功能:

  • clicked() 信号在点击时触发
  • 可设置文本/图标

用法:

QPushButton *btn = new QPushButton("重置");

connect(btn, &QPushButton::clicked, this, &MainWidget::on_resetButton_clicked);

QColorDialog(颜色对话框)

作用:提供颜色选择功能
功能:

  • getColor() 静态方法打开对话框
  • 返回用户选择的QColor

用法:

QColor color = QColorDialog::getColor(Qt::black, this, "选择颜色");

if(color.isValid()){

    // 使用有效颜色

}

二、Qt中绘图类的使用分析

1. QPainter(核心绘图工具)

核心功能:

void MainWidget::paintEvent(QPaintEvent*){

    QPainter painter(this);  // 1. 创建Painter对象

   

    painter.setPen(Qt::red); // 2. 设置画笔(轮廓)

    painter.setBrush(Qt::blue); // 设置画刷(填充)

   

    painter.drawRect(10,10,100,50); // 3. 绘制图形

}

基本图形绘制

方法

功能

示例

drawRect()

矩形

painter.drawRect(0,0,w,h)

drawEllipse()

椭圆/圆

painter.drawEllipse(0,0,d,d)

drawLine()

直线

painter.drawLine(x1,y1,x2,y2)

drawArc()

圆弧

painter.drawArc(x,y,w,h,start,span)

 QPainter可以在多种设备上绘制:

  • QPixmap:内存图像,适合屏幕显示

QPixmap pixmap(200,200);

QPainter painter(&pixmap);

  • QImage:像素级操作,适合图像处理
  • QWidget:直接在控件上绘制(如本实验)
  • QPrinter:打印输出

4. 坐标系统

  • 默认坐标系:左上角为原点(0,0),x向右增加,y向下增加
  • 视图-窗口转换:

painter.setWindow(-50,-50,100,100); // 定义逻辑坐标范围

painter.setViewport(0,0,width(),height()); // 映射到物理坐标

http://www.xdnf.cn/news/256771.html

相关文章:

  • 实现水平垂直居中的多种方法
  • 随机微分方程(SDE):股票价格模型、利率模型的构建
  • 【AI面试准备】传统测试工程师Prompt Engineering转型指南
  • 多种尝试解决Pycharm无法粘贴外部文本【本人问题已解决】
  • 第二届平航杯wp
  • 【Linux】线程同步与互斥
  • Vite 工具链
  • 变转速振动信号分析处理与故障诊断算法模块
  • 数字智慧方案6197丨智慧用电一体化服务运营解决方案(34页PPT)(文末有下载方式)
  • linux进程的复制和替换
  • map和set的遗留 + AVL树(1):
  • 架构师面试(三十七):监控系统架构模式
  • 新手学编程前端好还是后端
  • React useMemo函数
  • C语言 之【队列的简介、队列的实现(初始化、销毁、入队、出队、判空、元素个数、元素的访问)】
  • n8n 安装 n8n-nodes-mcp 社区节点
  • 对解微分方程分离变量法本质的思考
  • nt!NtReplyWaitReceivePortEx函数分析之nt!LpcpMoveMessage拷贝csr_api_msg
  • 【数据结构】单链表的增删查改
  • 微软发布了最新的开源推理模型套件“Phi-4-Reasoning
  • 构建更快,部署更智能:立即优化您的 Docker 设置
  • CPO-BP+NSGA,豪冠猪优化BP神经网络+多目标遗传算法!(Matlab完整源码和数据)
  • 如何掌握 Lustre/Scade 同步数据流语言
  • BERT+CRF模型在命名实体识别(NER)任务中的应用
  • 自主机器人模拟系统
  • Flutter - 概览
  • 数字智慧方案5869丨智慧健康医疗养老大数据整体规划方案(76页PPT)(文末有下载方式)
  • 【HarmonyOS Next】地图使用详解(三)标点定位问题
  • Java 中 Unicode 字符与字符串的转换:深入解析与实践
  • Go-web开发之帖子功能