Qt Creator - 输入窗口类 - QPlainTextEdit、QSpinBox、QDoubleSpinBox、QDateTimeEdit

1、QPlainTextEdit类

  本文参考了正点原子的《STM32MP157 嵌入式 Qt 开发指南》这本开源电子书,自己按照书的内容做了简单的小实验,并记录了一个小笔记,也是第一篇笔记,欢迎提问与指正,谢谢,如果对你有帮助,不妨点个赞呗。下面开始:

  QPlainTextEdit是一个显示和编辑纯文本(一般是多行文本和简单文本)的一个部件(过多文字介绍太抽象,在Qt Creator中试一试效果,就知道其功能和作用了,大家动动手一起操作吧)。

  这里,以QPlainTextEdit来建立一个能够操作文本的浏览+编辑器,它能读取工程项目中的一个文件,并添加RadioButton控件(后续文章将写此控件,这里就不做过多介绍了,欢迎关注),可将QPlainTextEdit设置为文本只读或非只读。

  首先建立一个工程项目文件,命名为:QPlainTextEdit,如下图所示。

image-20220901215755778

  然后,一路默认,到Details栏,按如下图建立工程,基类是QMainWindow,类名自己定义了,我这里写了MyMainWindow,由于不用UI界面,就不用点Generate form了。

image-20220901220242286

  最后,继续点默认,最后工程文件夹自动生成了(下图左边所示),下图显示的是main.cpp文件生成的内容。

image-20220901220934724

  接下来,我们需要在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

2、QSpinBox类

  QSpinBox类是一个微调小部件,这里建立一个利用QSpinBox调节背景窗口不透明度的小部件,下面开始。
  建立工程项目,命名为:QSpainBox,如下图所示。

  然后,一路默认,到Details栏,按如下图建立工程,基类是QMainWindow,类名自己定义了,我这里写了MyMainWindow,由于不用UI界面,就不用点Generate form了。
  最后,继续点默认,最后工程文件夹自动生成了(下图左边所示),下图显示的是main.cpp文件生成的内容。
  接下来,我们需要在mymainwindow.h、mymainwindow.cpp编辑内容,main.cpp默认执行就行。见下面的内容:

  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();
}

  程序最后运行的效果如下图所示:

  从这上面这三张图可以看到,当我们点击QSpinBox的右侧的小箭头(上下小箭头)可以以5%为步长调节背景的不透明度。

3、QDoubleSpinBox类

  QDoubleSpinBox是一个类似于QSpinBox的浮点型微调器,它能将其中的浮点数数值传递给槽函数,这里我们传递给控制窗口大小的槽函数,实现QDoubleSpinBox控制窗口大小。
  建立工程项目,命名为:QDoubleSpinBox,如下图所示。

  一路默认,到Details栏,按如下图建立工程,基类是QMainWindow,类名自己定义了,我这里写了MyMainWindow,由于不用UI界面,就不用点Generate form了。
  最后,继续点默认,最后工程文件夹自动生成了(下图左边所示),下图显示的是main.cpp文件生成的内容。
  接下来,我们需要在mymainwindow.h、mymainwindow.cpp编辑内容,main.cpp默认执行就行。见下面的内容:   **mymainwindow.h** 文件如下所示:
#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();
}

  程序运行后的效果如下图所示:

  当我们点击QDoubleSpinBox的小箭头,可以调整窗口的大小,初始默认是100%,我们点击到50%。

4、QDateTimeEdit类(包括QDateEdit、QTimeEdit)

  QDateTimeEdit是一个编辑和显示时间和年月的部件,它相当于是QDateEdit和QTimeEdit的结合。
  建立工程项目,命名为:QDateTimeEdit,如下图所示。

  一路默认,到Details栏,按如下图建立工程,基类是QMainWindow,类名自己定义了,我这里写了MyMainWindow,由于不用UI界面,就不用点Generate form了。
  最后,继续点默认,最后工程文件夹自动生成了(下图左边所示),下图显示的是main.cpp文件生成的内容。
  接下来,我们需要在mymainwindow.h、mymainwindow.cpp编辑内容,main.cpp默认执行就行。见下面的内容:

  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();
}

  程序运行后的效果如下图所示:

  上图是在Windows系统下的系统时间,当我们选中年、月、日、时、分、秒,可以点击箭头调整时间,如第二张图所示。   

未完待续!下方还在施工中,很快与大家见面^ - ^

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()函数来设置最大值与最小值的范围。当处在最小值时,滑块会处在滚动条的最左端(或最上端),同理,处在最大值时,滑块会处在滚动条的最右端(或最下端)。

  滑块的长度通常和page step(page step是当用户按下Page Up和Page Down键时值改变的量)的值相关,滑块的长度表示滚动视图(scrolling view)中所示的文档区域的比例。对page step值小小的

  首先,编辑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();
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值