一、Qt 输入组控件(Input Widgets)
Qt Input Widgets是一组用户界面元素,用于输入和显示文字和数字等的数据。这些小部件可以组成各种不同的表单和对话框,用户可以使用这些小部件与程序交互。
以下是Qt Input Widgets的一些常见小部件:
- QLineEdit:用于单行文本输入,比如用户名和密码等。
- QTextEdit:用于多行文本输入,比如邮件正文等。
- QPlainTextEdit:用于纯文本的多行输入,比如代码编辑器等。
- QSpinBox:用于数字输入,比如选择年龄等。
- QComboBox:用于下拉选择列表,比如选择性别等。
- QCheckBox:用于选择复选框,比如选择喜欢的运动等。
- QRadioButton:用于选择单选按钮,比如选择语言等。
Qt Input Widgets全部部件如下图:
控件名称依次解释如下:
- 编辑组合框
- 字体组合框
- 行编辑框
- 文本编辑框
- 多行文本编辑器
- 整数旋转框
- 小数旋转框
- 时间编辑
- 日期编辑
- 日期时间编辑
- 表盘控件
- 水平和垂直滚动条
- 水平和垂直滑动条
- 快捷键输入控件
案例分析:
main.window.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
// 1:Combo Box控件
#include <QComboBox>
// 2:FontComboBox控件
#include <QFontComboBox>
#include <QLabel>
// 3:Line Edit控件
#include <QLineEdit>
#include <QPushButton>
// 4:Plain Text Edit控件
#include <QPlainTextEdit>
#include <QRadioButton>
// 5:Spin Box控件
#include <QSpinBox>
// 6:时间控件
#include <QTimeEdit>
#include <QDateEdit>
#include <QDateTimeEdit>
// 7: Scroll Bar控件
#include <QScrollBar>
// 8: Key Sequence Edit控件
#include <QKeySequenceEdit>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
// 1:声明一个QComboBox对象
private:
QComboBox *combobox;
private slots:
void comboboxIndex(int);
// 2:声明QFontComboBox/QLabel对象
private:
QFontComboBox *fontcombobox;
QLabel *qlabels;
private slots:
void fontcomboboxFunc(QFont);
// 3:声明QLineEdit/QPushButton/QLabel对象
private:
QLineEdit *lineedit;
QPushButton *pushbutton;
QLabel *qlabely;
private slots:
void pushbuttonclicked();
// 4:声明QPlainTextEdit/QRadioButton对象
private:
QPlainTextEdit *plaintedit;
QRadioButton *radiobutton;
private slots:
void radioButtonClicked();
// 5:声明QPlainTextEdit/QRadioButton对象
private:
QSpinBox *spinbox;
private slots:
void spinboxValueChanged(int);
// 6:声明QDateTimeEdit/QTimeEdit/QDateEdit对象
private:
QDateTimeEdit *dte;
QTimeEdit *te;
QDateEdit *de;
// 7:声明QScrollBar对象
private:
QScrollBar *hscrollbar,*vscrollbar;
// 8:声明QKeySequenceEdit对象
private:
QKeySequenceEdit *kse;
private slots:
void keyseqeditChanged(const QKeySequence &);
};
#endif // MAINWINDOW_H
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
#include <QDir>
#include <QTextStream>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 设置主空格的显示位置及大小
this->setGeometry(300,200,1000,600);
// 1:QComboBox
combobox=new QComboBox(this); // 实例化对象
combobox->setGeometry(10,10,200,30);
combobox->addItem("北京市");
combobox->addItem("上海市");
combobox->addItem("天津市");
combobox->addItem("重庆市");
combobox->addItem("湖南省");
combobox->addItem("江西省");
combobox->addItem("广东省");
combobox->addItem("香港特别行政区");
combobox->addItem("澳门特别行政区");
// 信号槽函数连接实现
connect(combobox,SIGNAL(currentIndexChanged(int)),this,SLOT(comboboxIndex(int)));
// 2:QFontComboBox/QLabel
fontcombobox=new QFontComboBox(this);
qlabels=new QLabel(this);
fontcombobox->setGeometry(10,50,200,30);
qlabels->setGeometry(10,70,300,50);
// 信号与槽函数连接
connect(fontcombobox,SIGNAL(currentFontChanged(QFont)),this,SLOT(fontcomboboxFunc(QFont)));
// 3:QLineEdit/QPushButton/QLabel
lineedit=new QLineEdit(this);
lineedit->setGeometry(10,150,200,30);
pushbutton=new QPushButton(this);
pushbutton->setGeometry(220,150,100,30);
pushbutton->setText("点击我");
qlabely=new QLabel(this);
qlabely->setGeometry(10,200,400,30);
qlabely->setText("你输入的内容为:");
// 信号与槽函数连接
connect(pushbutton,SIGNAL(clicked()),this,SLOT(pushbuttonclicked()));
// 4:QPlainTextEdit/QRadioButton
plaintedit=new QPlainTextEdit(this);
plaintedit->setGeometry(10,250,400,200);
radiobutton=new QRadioButton(this);
radiobutton->setGeometry(300,220,200,30);
radiobutton->setText("只读模式");
// 设置工作目录为可执行程序的工作目录
QDir::setCurrent(QCoreApplication::applicationDirPath());
QFile fe("moc_mainwindow.cpp"); // moc(Meta-Object Compiler,也就是“元对象编译器”)找不到返回上一级
fe.open((QFile::ReadOnly|QFile::Text));
// 加载到文件流
QTextStream strin(&fe);
plaintedit->insertPlainText(strin.readAll());
// 信号与槽函数连接
connect(radiobutton,SIGNAL(clicked()),this,SLOT(radioButtonClicked()));
// 5: 改变窗口背景颜色
this->setStyleSheet("QMainWindow{background-color:""rgba(250,220,120,100%)}");
spinbox=new QSpinBox(this);
spinbox->setGeometry(440,250,150,30);
spinbox->setRange(0,100);
spinbox->setSingleStep(10);
spinbox->setValue(100);
spinbox->setSuffix("%不透明度");
// 信号与槽函数连接
connect(spinbox,SIGNAL(valueChanged(int)),this,SLOT(spinboxValueChanged(int)));
// 6:QDateTimeEdit/QTimeEdit/QDateEdit
dte=new QDateTimeEdit(QDateTime::currentDateTime(),this);
dte->setGeometry(440,290,200,30);
te=new QTimeEdit(QTime::currentTime(),this);
te->setGeometry(440,330,200,30);
de=new QDateEdit(QDate::currentDate(),this);
de->setGeometry(440,370,200,30);
// 7: QScrollBar
hscrollbar=new QScrollBar(Qt::Horizontal,this);
hscrollbar->setGeometry(0,500,1000,30);
vscrollbar=new QScrollBar(Qt::Vertical,this);
vscrollbar->setGeometry(970,0,30,500);
// 8:QKeySequenceEdit
kse=new QKeySequenceEdit(this);
kse->setGeometry(400,530,200,30);
// 信号与槽函数连接
connect(kse,SIGNAL(keySequenceChanged(const QKeySequence &)),
this,SLOT(keyseqeditChanged(const QKeySequence &)));
}
MainWindow::~MainWindow()
{
delete ui;
}
// 1:
void MainWindow::comboboxIndex(int index)
{
qDebug()<<"你选择的区别是:"<<combobox->itemText(index)<<endl;
QMessageBox mybox(QMessageBox::Question,"信息",combobox->itemText(index),QMessageBox::Yes|QMessageBox::No);
mybox.exec();
}
// 2:
void MainWindow::fontcomboboxFunc(QFont font)
{
qlabels->setFont(font);
QString qStr="罗小白的干爹";
qlabels->setText(qStr);
}
// 3:
void MainWindow::pushbuttonclicked()
{
QString qStr;
qStr="你输入的内容为:";
qStr=qStr+lineedit->text();
qlabely->setText(qStr);
lineedit->clear();
}
// 4:
void MainWindow::radioButtonClicked()
{
if(radiobutton->isChecked()){
plaintedit->setReadOnly(true);
}
else
plaintedit->setReadOnly(false);
}
// 5:
void MainWindow::spinboxValueChanged(int x)
{
double dx=(double)x/100;
this->setWindowOpacity(dx);
}
// 8:
void MainWindow::keyseqeditChanged(const QKeySequence &key)
{
if(key==QKeySequence(tr("Ctrl+Q")))
this->close();
else
qDebug()<<key.toString()<<endl;
}
编译执行结果:
二、Qt 显示组控件(Display Widgets)
Qt Display Widgets 是 Qt 框架中用于显示和展示数据的相关窗口部件。该部件库包含了多种用于显示文本、图像、图表、列表、树形结构等数据的窗口部件,支持用户交互、布局和样式自定义等功能。以下是 Qt Display Widgets 的主要部件:
-
QLabel:用于显示文本和图像。
-
QTextEdit:用于显示和编辑富文本。
-
QPlainTextEdit:用于显示和编辑纯文本。
-
QListView:用于显示列表数据。
-
QTreeView:用于显示树形结构数据。
-
QTableWidget:用于显示二维表格数据。
-
QChartView:用于显示各种图表,如折线图、柱状图、饼图等。
Qt Display Widgets 全部部件如下图:
控件名称依次解释如下:
- Label: 标签
- Text Browser:文本浏览器
- Graphics View :图形视图框架
- Calendar Widget : 日历控件
- LCD Number:液晶字体数字控件
- Progress Bar: 进度条
- Horizontal Line/Vertical Line :水平线/垂直线
- OpenGL Widget : OpenGL 图形染控件
- QQuickWidget :QML 嵌入控件
案例实现功能:
- Label: 标签 -> 放图片
- Text Browser:文本浏览器 -> 存放打开的文件
- 测试进度条
- 通过按钮开始或暂停定时
ui绘图:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
// 1:
#include <QMessageBox>
// 2:
#include <QFile>
// 4:
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButtonProgressBar_clicked();
void on_pushbtnstart_clicked();
void on_pushbtnpause_clicked();
void on_pushbtnreset_clicked();
// 4:
// 自定义函数:定时器
void on_timerout();
private:
int iValues=0;
QTimer *timers; // 定时器
void InitFunc();
private:
Ui::Widget *ui;
// 1:
private:
void textlabelFunc();
// 2:
private:
void textbrowserFuncReadTxt();
};
#endif // WIDGET_H
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 1:调用函数
textlabelFunc();
// 2:调用函数
textbrowserFuncReadTxt();
// 3:初始化进程条
ui->progressBar->setRange(0,1000000);
ui->progressBar->setValue(0);
// 4:
InitFunc();
// 信号与槽函数连接
connect(timers,&QTimer::timeout,this,&Widget::on_timerout);
}
Widget::~Widget()
{
delete ui;
}
// 1:
void Widget::textlabelFunc()
{
QString fName("D:\\刘德华.jpg");
QImage *qimg=new QImage;
if(!(qimg->load(fName))) // 判断加载图片
{
QMessageBox::information(this,"失败","加载jpg图片失败,请重新检查?");
delete qimg;
return;
}
ui->label->setPixmap(QPixmap::fromImage(*qimg));
}
// 2:
void Widget::textbrowserFuncReadTxt()
{
QString qStrdData;
QFile qfile("d:\\THIRD-PARTY-LICENSES.txt");
if(!(qfile.open(QIODevice::ReadOnly|QIODevice::Text)))
{
QMessageBox::warning(this,"失败","打开文件失败,请重新检查?");
}
while (!qfile.atEnd())
{
QByteArray ay=qfile.readLine();
QString strs(ay);
qStrdData.append(strs);
}
ui->textBrowser->setText(qStrdData);
}
void Widget::on_pushButtonProgressBar_clicked()
{
for(int i=1;i<=1000000;i++)
{
for(int j=0;j<1;j++)
{
ui->progressBar->setValue(i);
}
}
}
void Widget::on_pushbtnstart_clicked()
{
timers->start(); // 1s触发一次操作
ui->pushbtnstart->setEnabled(false);
ui->pushbtnpause->setEnabled(true);
ui->pushbtnreset->setEnabled(true);
}
void Widget::on_pushbtnpause_clicked()
{
timers->stop(); // 1s触发一次操作
ui->pushbtnstart->setEnabled(true);
ui->pushbtnpause->setEnabled(false);
ui->pushbtnreset->setEnabled(true);
}
void Widget::on_pushbtnreset_clicked()
{
timers->stop(); // 1s触发一次操作
iValues=0;
ui->lcdNumber->display(iValues);
ui->pushbtnstart->setEnabled(true);
ui->pushbtnpause->setEnabled(true);
ui->pushbtnreset->setEnabled(false);
}
void Widget::InitFunc()
{
timers=new QTimer(this);
timers->setInterval(1000); // 定时周期为1s
timers->stop();
}
void Widget::on_timerout()
{
iValues++;
ui->lcdNumber->display(iValues);
}
编译执行结果: