QT利用spinbox,checkbox, radiobutton, slider 和 dial控件实现一个简单的绘图程序,写出详细代码
时间: 2024-03-20 21:42:05 浏览: 122
好的,下面是一个实现绘图程序的例子代码,您可以参考一下:
mainwindow.h
```cpp
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QWidget>
#include <QSpinBox>
#include <QCheckBox>
#include <QRadioButton>
#include <QSlider>
#include <QDial>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
QWidget *m_widget; //绘图区域
QSpinBox *m_spinBox; //绘图区域大小控件
QCheckBox *m_checkBox; //填充颜色控制控件
QRadioButton *m_rectRadioBtn; //矩形形状控制控件
QRadioButton *m_circleRadioBtn; //圆形形状控制控件
QSlider *m_slider; //边框宽度控制控件
QDial *m_dial; //旋转角度控制控件
int m_widgetWidth; //绘图区域宽度
int m_widgetHeight; //绘图区域高度
bool m_isFilled; //是否填充颜色
bool m_isRect; //是否是矩形
int m_borderWidth; //边框宽度
int m_rotateAngle; //旋转角度
void drawWidget(); //绘制绘图区域
private slots:
void onSpinBoxValueChanged(int value); //绘图区域大小控制控件valueChanged()信号槽函数
void onCheckBoxStateChanged(int state); //填充颜色控制控件stateChanged()信号槽函数
void onRectRadioBtnToggled(bool checked); //矩形形状控制控件toggled()信号槽函数
void onCircleRadioBtnToggled(bool checked); //圆形形状控制控件toggled()信号槽函数
void onSliderValueChanged(int value); //边框宽度控制控件valueChanged()信号槽函数
void onDialValueChanged(int value); //旋转角度控制控件valueChanged()信号槽函数
};
#endif // MAINWINDOW_H
```
mainwindow.cpp
```cpp
#include "mainwindow.h"
#include <QVBoxLayout>
#include <QPainter>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
//初始化绘图区域
m_widgetWidth = 200;
m_widgetHeight = 200;
m_isFilled = false;
m_isRect = true;
m_borderWidth = 1;
m_rotateAngle = 0;
m_widget = new QWidget(this);
m_widget->setFixedSize(m_widgetWidth, m_widgetHeight);
drawWidget();
//初始化控件
m_spinBox = new QSpinBox(this);
m_spinBox->setRange(100, 500);
m_spinBox->setValue(m_widgetWidth);
m_checkBox = new QCheckBox("Fill", this);
m_rectRadioBtn = new QRadioButton("Rectangle", this);
m_circleRadioBtn = new QRadioButton("Circle", this);
m_rectRadioBtn->setChecked(true);
m_slider = new QSlider(Qt::Horizontal, this);
m_slider->setRange(1, 10);
m_slider->setValue(m_borderWidth);
m_dial = new QDial(this);
m_dial->setRange(0, 360);
m_dial->setValue(m_rotateAngle);
//布局控件
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(m_spinBox);
layout->addWidget(m_checkBox);
layout->addWidget(m_rectRadioBtn);
layout->addWidget(m_circleRadioBtn);
layout->addWidget(m_slider);
layout->addWidget(m_dial);
layout->addStretch();
m_widget->setLayout(layout);
setCentralWidget(m_widget);
//连接信号槽
connect(m_spinBox, SIGNAL(valueChanged(int)), this, SLOT(onSpinBoxValueChanged(int)));
connect(m_checkBox, SIGNAL(stateChanged(int)), this, SLOT(onCheckBoxStateChanged(int)));
connect(m_rectRadioBtn, SIGNAL(toggled(bool)), this, SLOT(onRectRadioBtnToggled(bool)));
connect(m_circleRadioBtn, SIGNAL(toggled(bool)), this, SLOT(onCircleRadioBtnToggled(bool)));
connect(m_slider, SIGNAL(valueChanged(int)), this, SLOT(onSliderValueChanged(int)));
connect(m_dial, SIGNAL(valueChanged(int)), this, SLOT(onDialValueChanged(int)));
}
MainWindow::~MainWindow()
{
}
void MainWindow::drawWidget()
{
//绘制函数
QPainter painter(m_widget);
painter.setRenderHint(QPainter::Antialiasing);
painter.setBrush(QBrush(Qt::white, m_isFilled ? Qt::SolidPattern : Qt::NoBrush));
painter.setPen(QPen(Qt::black, m_borderWidth));
if (m_isRect) {
painter.drawRect(0, 0, m_widgetWidth, m_widgetHeight);
} else {
painter.drawEllipse(0, 0, m_widgetWidth, m_widgetHeight);
}
painter.rotate(m_rotateAngle);
painter.end();
}
void MainWindow::onSpinBoxValueChanged(int value)
{
//更新绘图区域大小
m_widgetWidth = value;
m_widgetHeight = value;
m_widget->setFixedSize(m_widgetWidth, m_widgetHeight);
drawWidget();
}
void MainWindow::onCheckBoxStateChanged(int state)
{
//更新填充颜色状态
m_isFilled = state == Qt::Checked;
drawWidget();
}
void MainWindow::onRectRadioBtnToggled(bool checked)
{
//更新形状为矩形
if (checked) {
m_isRect = true;
drawWidget();
}
}
void MainWindow::onCircleRadioBtnToggled(bool checked)
{
//更新形状为圆形
if (checked) {
m_isRect = false;
drawWidget();
}
}
void MainWindow::onSliderValueChanged(int value)
{
//更新边框宽度
m_borderWidth = value;
drawWidget();
}
void MainWindow::onDialValueChanged(int value)
{
//更新旋转角度
m_rotateAngle = value;
drawWidget();
}
```
这个例子中,我们使用了QWidget作为绘图区域,使用了QSpinBox、QCheckBox、QRadioButton、QSlider和QDial控件来控制绘图区域。当用户改变控件的值时,我们会重新绘制绘图区域。注意,我们在绘制函数中使用了QPainter来进行绘制,并且在更新控件的值时,都会调用绘制函数来更新绘图区域。
希望这个例子能够帮助到您。如果您有任何疑问,请随时问我。
阅读全文