1、QPlainTextEdit类
本文参考了正点原子的《STM32MP157 嵌入式 Qt 开发指南》这本开源电子书,自己按照书的内容做了简单的小实验,并记录了一个小笔记,也是第一篇笔记,欢迎提问与指正,谢谢,如果对你有帮助,不妨点个赞呗。下面开始:
QPlainTextEdit是一个显示和编辑纯文本(一般是多行文本和简单文本)的一个部件(过多文字介绍太抽象,在Qt Creator中试一试效果,就知道其功能和作用了,大家动动手一起操作吧)。
这里,以QPlainTextEdit来建立一个能够操作文本的浏览+编辑器,它能读取工程项目中的一个文件,并添加RadioButton控件(后续文章将写此控件,这里就不做过多介绍了,欢迎关注),可将QPlainTextEdit设置为文本只读或非只读。
首先建立一个工程项目文件,命名为:QPlainTextEdit,如下图所示。
![image-20220901215755778](https://img-blog.csdnimg.cn/806b315df3be4337ad745eaee979e9fe.png)
然后,一路默认,到Details栏,按如下图建立工程,基类是QMainWindow,类名自己定义了,我这里写了MyMainWindow,由于不用UI界面,就不用点Generate form了。
![image-20220901220242286](https://img-blog.csdnimg.cn/6f630bb6f3384f86acd250b271502fd3.png)
最后,继续点默认,最后工程文件夹自动生成了(下图左边所示),下图显示的是main.cpp文件生成的内容。
![image-20220901220934724](https://img-blog.csdnimg.cn/f64b33ef69be4993aa2bf12bd86ed1e6.png)
接下来,我们需要在mymainwindow.h、mymainwindow.cpp编辑内容,main.cpp默认执行就行。见下面的内容:
mymainwindow.h 文件如下所示:
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QPlainTextEdit>
#include <QRadioButton>
#include <QMainWindow>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow();
private:
QPlainTextEdit *plain_text_edit;
QRadioButton *radio_button;
private slots:
void radioButton_clicked();
};
#endif
mymainwindow.cpp文件如下所示:
#include "mymainwindow.h"
#include <QDir>
#include <QTextStream>
#include <QCoreApplication>
MyMainWindow::MyMainWindow(QWidget *parent) : QMainWindow(parent)
{
QDir::setCurrent(QCoreApplication::applicationDirPath());
this -> setGeometry(0, 0, 1500, 1000); //设置MainWindow主窗口的位置与大小
plain_text_edit = new QPlainTextEdit(this);
plain_text_edit->setGeometry(0, 50, 1500, 800); //设置QPlainTextEdit框的位置与大小
radio_button = new QRadioButton(this);
radio_button->setGeometry(1300, 10, 200, 40); //设置RadioButton的位置与大小
radio_button->setText("设置只读");
QFile file("a.cpp");
file.open((QFile::ReadOnly | QFile::Text)); //QFile以只读(ReadOnly)文本(Text)方式打开.cpp文件
QTextStream in(&file); //将文件加载到文本流(TextStream)
plain_text_edit->insertPlainText(in.readAll()); //将文本流in中所有的内容放入到plainTextEdit中
connect(radio_button, SIGNAL(clicked()), this, SLOT(radioButton_clicked()));
}
MyMainWindow::~MyMainWindow()
{
}
void MyMainWindow::radioButton_clicked()
{
if(radio_button->isChecked()) { //检查radioButton是否被选中
plain_text_edit->setReadOnly(true); //如果选中,就将文本设为只读
} else {
plain_text_edit->setReadOnly(false); //否则,就设为非只读模式
}
}
main.cpp 文件如下所示(不用改,默认就行):
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}
QPlainTextEdit框允许用户编辑和浏览框中的内容,框中的内容即是在a.cpp文件中编辑的(这里只是设置了是否只读,应该也可以设置保存与否),这里添加了QRadioButton控件可以设置编辑框为只读或非只读模式(调用了QPlainTextEdit中setReadOnly方法)。
最后输出的效果如下图所示,可以在编辑框中输入信息。
![image-20220901233911234](https://img-blog.csdnimg.cn/698cf9651e7b40958fe6144ac5c6fded.png)
2、QSpinBox类
QSpinBox类是一个微调小部件,这里建立一个利用QSpinBox调节背景窗口不透明度的小部件,下面开始。
建立工程项目,命名为:QSpainBox,如下图所示。
![](https://img-blog.csdnimg.cn/a5f5bb6623f54f01a01af80747b45f87.png)
![](https://img-blog.csdnimg.cn/e04fedf4d69b405e865f4ccb2b022b8b.png)
![](https://img-blog.csdnimg.cn/0fc21ab877b7400e920be29b7c3bf7af.png)
mymainwindow.h 文件如下所示:
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include <QSpinBox>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow();
private:
QSpinBox *spin_box;
private slots:
void spin_box_change(int);
};
#endif
mymainwindow.cpp文件如下所示:
#include "mymainwindow.h"
MyMainWindow::MyMainWindow(QWidget *parent) : QMainWindow(parent)
{
this->setGeometry(0, 0, 1500, 1000); //设置MainWindow主窗口的位置与大小
this->setStyleSheet("QMainWindow{background-color: ""rgba(67, 142, 219, 100%) }"); //设置主窗口背景颜色与不透明度
spin_box = new QSpinBox(this);
spin_box->setGeometry(750, 500, 200, 50); //设置SpinBox的位置与大小
spin_box->setRange(0, 100); //设置SpinBox的调整范围为0 ~ 100
spin_box->setSingleStep(5); //点击就可以以5为步长调整
spin_box->setValue(100); //设置初始值为100
spin_box->setSuffix("%的不透明度"); //在框内添加后缀“%的不透明度”
connect(spin_box, SIGNAL(valueChanged(int)), this, SLOT(spin_box_change(int)));
}
MyMainWindow::~MyMainWindow()
{
}
void MyMainWindow::spin_box_change(int o)
{
double oo = (double)o / 100; //将槽函数收到的值o变成百分制,所以除以100,其值的范围为0.0 ~ 1.0
this->setWindowOpacity(oo); //设置窗口的不透明度,0.0为完全透明,1.0为完全不透明
}
main.cpp 文件如下所示(不用改,默认就行):
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}
程序最后运行的效果如下图所示:
![](https://img-blog.csdnimg.cn/27cf57504565400488bb0e6f0630c19a.png)
![](https://img-blog.csdnimg.cn/f138bb0df0a445538ff8434382dad3bf.png)
![](https://img-blog.csdnimg.cn/41b695c1c8a74a26a7cad74489e6be49.png)
3、QDoubleSpinBox类
QDoubleSpinBox是一个类似于QSpinBox的浮点型微调器,它能将其中的浮点数数值传递给槽函数,这里我们传递给控制窗口大小的槽函数,实现QDoubleSpinBox控制窗口大小。
建立工程项目,命名为:QDoubleSpinBox,如下图所示。
![](https://img-blog.csdnimg.cn/bfb092db8a904fb6a5cefa5a19b5e632.png)
![](https://img-blog.csdnimg.cn/d4a8c9e14ea64ba9a031c25b56c995f0.png)
![](https://img-blog.csdnimg.cn/52934963236f471c8fa729b82417ec98.png)
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include <QDoubleSpinBox>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow();
private:
QDoubleSpinBox *double_spin_box;
private slots:
void double_spin_box_change(double);
};
#endif
mymainwindow.cpp文件如下所示:
#include "mymainwindow.h"
MyMainWindow::MyMainWindow(QWidget *parent) : QMainWindow(parent)
{
this->setGeometry(0, 0, 800, 400); //设置MainWindow主窗口的位置与大小
double_spin_box = new QDoubleSpinBox(this);
double_spin_box->setGeometry(this->width() / 2, this->height() / 2, 210, 50);
double_spin_box->setPrefix("主窗口大小:");
double_spin_box->setSuffix("%");
double_spin_box->setRange(10.0, 100.0);
double_spin_box->setValue(100.0);
double_spin_box->setSingleStep(1.0);
connect(double_spin_box, SIGNAL(valueChanged(double)), this, SLOT(double_spin_box_change(double)));
}
MyMainWindow::~MyMainWindow()
{
}
void MyMainWindow::double_spin_box_change(double v)
{
int w = 1500 * v / 100;
int h = 1000 * v / 100;
this->setGeometry(0, 0, w, h);
double_spin_box->setGeometry(this->width() / 2, this->height() / 2, 210, 50);
}
main.cpp 文件如下所示(不用改,默认就行):
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}
程序运行后的效果如下图所示:
![](https://img-blog.csdnimg.cn/31dbba29005d4b279d8b05c0e6cf02d6.png)
![](https://img-blog.csdnimg.cn/6e33cfac30d1460a8dd8ce513003fbd7.png)
4、QDateTimeEdit类(包括QDateEdit、QTimeEdit)
QDateTimeEdit是一个编辑和显示时间和年月的部件,它相当于是QDateEdit和QTimeEdit的结合。
建立工程项目,命名为:QDateTimeEdit,如下图所示。
![](https://img-blog.csdnimg.cn/bb4f5a5c819a462e88053e9097490747.png)
![](https://img-blog.csdnimg.cn/fb328c9afd0b4575bbf9e8fc27ea1817.png)
![](https://img-blog.csdnimg.cn/f3767606b4034706904a8e864741b6a7.png)
mymainwindow.h 文件如下所示:
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include <QDateTimeEdit>
#include <QDateEdit>
#include <QTimeEdit>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow();
private:
QDateTimeEdit *date_time_edit;
QDateEdit *date_edit;
QTimeEdit *time_edit;
};
#endif
mymainwindow.cpp文件如下所示:
#include "mymainwindow.h"
MyMainWindow::MyMainWindow(QWidget *parent) : QMainWindow(parent)
{
this->setGeometry(600, 200, 800, 600); //设置MainWindow主窗口的位置与大小
date_time_edit = new QDateTimeEdit(QDateTime::currentDateTime(), this);
date_time_edit->setGeometry(300, 200, 150, 30);
time_edit = new QTimeEdit(QTime::currentTime(), this);
time_edit->setGeometry(300, 250, 150, 30);
date_edit = new QDateEdit(QDate::currentDate(), this);
date_edit->setGeometry(300, 300, 150, 30);
}
MyMainWindow::~MyMainWindow()
{
}
main.cpp 文件如下所示(不用改,默认就行):
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}
程序运行后的效果如下图所示:
![](https://img-blog.csdnimg.cn/af3a662e9bdf4fc6843a761b77170b3f.png)
![](https://img-blog.csdnimg.cn/95a0c55ed84a45c2a9a598dccd85ba2e.png)
未完待续!下方还在施工中,很快与大家见面^ - ^
4、QDial类
mymainwindow.h 文件如下所示:
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include <QDial>
#include <QLabel>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow();
private:
QDial *dial;
QLabel *label;
private slots:
void dial_value_change(int);
};
#endif // MYMAINWINDOW_H
mymainwindow.cpp文件如下所示:
#include "mymainwindow.h"
MyMainWindow::MyMainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setGeometry(600, 200, 800, 600); //主窗口位置与大小
dial = new QDial(this);
dial->setGeometry(300, 200, 200, 200); //设置QDial位置与大小
dial->setPageStep(10);
dial->setNotchesVisible(true); //设置刻度是否可见,这里得设置可见
dial->setNotchTarget(1.0); //设置凹口之间的放置的像素数,实际大小与目标大小可能不同,默认是3.7像素,这里设置为1.0
dial->setRange(0, 100); //设置QDial的刻度取值范围
label = new QLabel(this);
label->setGeometry(370, 300, 200, 50); //QLabel位置与大小
label->setText("0km/h"); //QLabel初始值为0km/h
connect(dial, SIGNAL(valueChanged(int)), this, SLOT(dial_value_change(int)));
}
MyMainWindow::~MyMainWindow()
{
}
void MyMainWindow::dial_value_change(int v)
{
label->setText(QString::number(v) + "km/h");
}
main.cpp 文件如下所示(不用改):
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}
4、QScrollBar类 和 QSlider类
QScrollBar和QSlider都继承自QAbstractSlider,两者均为用户提供了垂直或水平移动的滑动条,但是两者的使用场景差别较大。QScrollbar常用于空间位置的变化,比如窗口中有一张显示不全的大图片,可以通过水平和垂直的滑块移动来查看。QSlider则控制比如音乐播放器的声音大小,播放的进度条等。下面对两个类进行详细得描述吧:
先介绍QScrollBar吧,它提供了滑动条(scroll bar)这个小部件(widget)或者称为控件(control),使用户能够访问无法完全展示大文件的小部件。但是,若需要在另一个widget上提供滚动视图(scrolling view),使用 QScrollArea 类可能更方便,因为它提供了视口小部件(viewport widget)和滚动条。在一个给定数值范围内,滑动控件能够获得其中的一个值(这里比较抽象,举个例子吧,音乐播放器都有个音量控制滑块,它的音量大小从0最小值到100最大音量,当我们调节滑块到一个位置时,它都有个具体的音量大小,这个大小就有个具体的数值),那么使用QSlider类就很适合。
滚动条(Scroll bars)包含四个单独的控件,一个滑块(slider)、两个滚动箭头(scroll arrows)、页面控件(page control),每个控件具体的作用功能就不赘述了(可以看下Qt帮助文档),看下面的图片各位应该就很熟悉了吧。滚动条在数值范围内的某个位置时,可以通过value()获得滑块离起始位置距离,也可以通过setValue()设置滑块距离起始的位置。通过minimum()和maximum()获得滑块在最小值和最大值位置的值,可以通过setMinimum()和setMaximum()函数来设置最大值与最小值的范围。当处在最小值时,滑块会处在滚动条的最左端(或最上端),同理,处在最大值时,滑块会处在滚动条的最右端(或最下端)。
![](https://img-blog.csdnimg.cn/d68b4af58be2485ab0a14b3efab2ca70.png)
首先,编辑mymainwindow.h头文件:
#ifndef MYMAINWINDOW_H
#define MYMAINWINDOW_H
#include <QMainWindow>
#include <QScrollBar>
#include <QLabel>
class MyMainWindow : public QMainWindow
{
Q_OBJECT
public:
MyMainWindow(QWidget *parent = nullptr);
~MyMainWindow();
private:
QScrollBar *x_scroll_bar;
QScrollBar *y_scroll_bar;
private slots:
void dial_value_change(int);
};
#endif // MYMAINWINDOW_H
然后,编辑mymainwindow.cpp源程序文件:
#include "mymainwindow.h"
MyMainWindow::MyMainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->setGeometry(600, 200, 800, 600); //主窗口位置与大小
dial = new QDial(this);
dial->setGeometry(300, 200, 200, 200); //设置QDial位置与大小
dial->setPageStep(10);
dial->setNotchesVisible(true); //设置刻度是否可见,这里得设置可见
dial->setNotchTarget(1.0); //设置凹口之间的放置的像素数,实际大小与目标大小可能不同,默认是3.7像素,这里设置为1.0
dial->setRange(0, 100); //设置QDial的刻度取值范围
label = new QLabel(this);
label->setGeometry(370, 300, 200, 50); //QLabel位置与大小
label->setText("0km/h"); //QLabel初始值为0km/h
connect(dial, SIGNAL(valueChanged(int)), this, SLOT(dial_value_change(int)));
}
MyMainWindow::~MyMainWindow()
{
}
void MyMainWindow::dial_value_change(int v)
{
label->setText(QString::number(v) + "km/h");
}
最后,编辑main.cpp主程序文件(这里不用修改):
#include "mymainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyMainWindow w;
w.show();
return a.exec();
}