qt控件又称组件或者部件,指用户看到的所有可视化界面以及界面中的各个元素,比如按钮,文本框,输入框等。
1.QMainWindow类生成的窗口自带菜单栏,工具栏和状态栏,中央区域还可添加多个控件,常用来作为应用程序的主窗口;
2.QDialog类生成的窗口非常简单,没有菜单栏,工具栏和状态栏,但可以添加多个控件,常用来制作对话框。
3.QWidget类,用法非常灵活,即可用来制作窗口,还可作为某个窗口上的控件。
实际开发中,制作应用程序的主窗口可以用QMainWindow或者QWidget;制作提示信息的对话框用QDialog或QWidget;如果暂时无法决定,后续可能作为窗口,也可能作为控件,就选择QWidget。
实例:
//main.cpp
#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//添加窗口
QWidget widget;
//定义一个按钮,它位于 widget 窗口中
QPushButton But("按钮控件",&widget);
//设置按钮的位置和尺寸
But.setGeometry(10,10,100,50);
//信号与槽,实现当用户点击按钮时,widget 窗口关闭
QObject::connect(&But,&QPushButton::clicked,&widget,&QWidget::close);
//让 widget 窗口显示
widget.show();
return a.exec();
}
整个程序的运行过程如下:
1.先创建了一个 QWidget 窗口,在窗口上添加一个 QPushButton 按钮;
2.当用户点击按钮时,Qt 会将此事件分派给 QPushButton 类的 mousePressEvent() 事件处理函数;mousePressEvent()函数内部会改变按钮的属性,提示用户成功按下了按钮,还会调用 clicked() 函数发出“用户点击按钮”的信号。对于发出的信号,程序中调用 connect() 函数指定 QWidget 类的 close() 函数接收 clicked() 信号,close() 函数会关闭 widget 窗口。
信号和槽:
是Qt特有的消息传输机制,它能将相互独立的控件关联起来。
每个信号都可以用函数表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。
信号函数和槽函数通常位于某个类中,和普通成员函数比,特别之处:
1.信号函数用signal关键字修饰,槽函数用public slots protected slots 或者 private slots 修饰
2.信号函数只需要声明,不需要定义(实现),槽函数需要定义(实现)
实际开发中:可以使用qt提供的信号函数和槽函数,也可以根据需要自定义信号函数和槽函数。
qt QLabel文本框的使用:
1.QLabel是qt帮我们写好的一个控件类,间接继承与QWidget类,继承关系:
QLabel->QFrame->QWidget
基础功能:显示一串文本。如:显示一个普通的文本框,还可以放置图片,超链接,动画等内容。
实例:
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建一个文本框
QLabel lab;
//设置文本框内容居中显示
lab.setAlignment(Qt::AlignCenter);
//设置文本框的坐标和尺寸
lab.setGeometry(100,100,400,400);
//设置文本框的外观,包括字体的大小和颜色、按钮的背景色
lab.setStyleSheet("QLabel{font:30px;color:red;background-color:rgb(f9,f9,f9);}");
//设置文本框要显示超链接内容
lab.setText("<a href=\"http://c.biancheng.net\">C语言中文网");
//当用户鼠标位于文本框上时,显示提示内容
lab.setToolTip("点击超链接显示URL");
//提示内容显示 1 秒
lab.setToolTipDuration(1000);
//为文本框设置信号和槽,当用户点击超链接时,将文本框内容改为超链接的 URL
QObject::connect(&lab,&QLabel::linkActivated,&lab,&QLabel::setText);
//程序运行后,文本框显示
lab.show();
return a.exec();
}
执行结果如下图所示,用户最先看到的是图 3a),当用户鼠标移动到文本框区域内时,会提示“点击超链接显示URL”,提示时间为 1 秒。当用户点击“C语言中文网”时会触发 linkActivated() 信号函数,该函数会调用 setText() 函数,将文本框中显示的“C语言中文网”改为“http://c.biancheng.net”,字体颜色为红色,如图 3b) 所示。
2.QPushButton:实际开发中最常用的一种按钮,间接继承自QWidget,继承关系如下:
QPushButton->QAbstractButton->QWidget(其中QAbstractButton是所有按钮类的基类)
QPushButton类专门用来创建可按压的按钮;
功能:放置一串文本,文本左侧可以放置图标,必要时还可以在按钮上放置图片。
实例:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
//设置 widget 窗口的标题
widget.setWindowTitle("QWidget窗口");
//创建一个按钮,并内嵌到 widget 窗口中
QPushButton but("QPushButton按钮",&widget);
//按钮的位置位于距 widget 窗口左上角 (100,100) 的位置
but.move(100,100);
//设置按钮上文字的大小。
but.setStyleSheet("QPushButton{font:20px;}");
//调整按钮的尺寸
but.resize(200,200);
//建立信息和槽,当用户点击并释放按钮后,该按钮隐藏。
QObject::connect(&but,&QPushButton::clicked,&but,&QPushButton::hide);
widget.show();
return a.exec();
}
运行结果:点击图中按钮,按钮隐藏
3.QLineEdit是Qt提供的控件类,直接继承QWidget类,专门用来创建单行输入框。
实际开发中,经常用到QLineEdit输入框,如:接受用户输入的个人信息,账户信息,角色名称等。
实例:
#include <QApplication>
#include <QWidget>
#include <QLineEdit>
using namespace std;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建一个窗口,作为输入框的父窗口
QWidget widget;
//设置窗口的标题
widget.setWindowTitle("QWidget窗口");
//接下来,分别创建两个输入框,用于让用户分别输入账号和密码
//创建账号输入框
QLineEdit lineEdit(&widget);
//指定输入框位于父窗口中的位置
lineEdit.move(100,100);
//设置提示信息
lineEdit.setPlaceholderText("请输入账号...");
//让输入框显示“一键清除”按钮
lineEdit.setClearButtonEnabled(true);
//创建密码输入框
QLineEdit lineEditPass(&widget);
lineEditPass.setPlaceholderText("请输入密码...");
lineEditPass.move(100,150);
//指定文本显示方式,保护用户账号安全
lineEditPass.setEchoMode(QLineEdit::Password);
//指定窗口的尺寸和显示文字的大小
widget.resize(500,300);
widget.setFont(QFont("宋体",16));
widget.show();
return a.exec();
}
运行结果为:
4.QListWidget列表框,可以很轻松地创建一个列表。继承关系:
QListWidget -> QListView -> QAbstractItemView -> QAbstractScrollArea -> QFrame -> QWidget
QListWidget 只能创建结构简单的列表,如果要制作复杂的列表,应优先考虑 QListView,因为它的功能更强大,很多 QListWidget 难以实现的功能,QListView 都能实现。
实例:
//main.cpp
#include <QApplication>
#include <QWidget>
#include <QListWidget>
#include <QLabel>
#include <QListWidgetItem>
using namespace std;
class QMyLabel:public QLabel{
Q_OBJECT
public slots:
void rsetText(QListWidgetItem *item);
};
void QMyLabel::rsetText(QListWidgetItem *item){
this->setText(item->text());
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建一个窗口,作为输入框的父窗口
QWidget widget;
//设置窗口的标题
widget.setWindowTitle("QWidget窗口");
widget.resize(500,500);
QListWidget listWidget(&widget);
listWidget.resize(500,400);
listWidget.setFont(QFont("宋体",14));
listWidget.addItem("C语言中文网");
listWidget.addItem("http://c.biancheng.net");
listWidget.addItem(new QListWidgetItem("Qt教程"));
QMyLabel print;
print.setText("选中内容");
print.setParent(&widget);
print.resize(500,100);
print.move(0,400);
print.setAlignment(Qt::AlignCenter);
QObject::connect(&listWidget,&QListWidget::itemClicked,&print,&QMyLabel::rsetText);
widget.show();
return a.exec();
}
//QMyLabel类的定义应该放到 .h 文件中,本例中将其写到 main.cpp 中,程序最后需要添加 #include "当前源文件名.moc" 语句,否则无法通过编译。
#include "main.moc"
程序中,我们自定义了一个 QMyLabel 类,它继承自 QLabel 文本框类,因此 QMyLabel 也是一个文本框类。在 QMyLabel 类中,我们自定义了一个 rsetText() 槽函数。
运行结果:
5.QTableWidget
是qt的一种表格控件,类似于excel表格,可以以数据的方式展示给用户,如下图:
分为3个区域:
区域1,2都是表头,区域1设置每一行的表头,区域2设置每一列的表头。
区域3为数据区,表格中所有的数据位于此区域,该区域可以存放单元格,也可以存放按钮,文本框等控件。
QTableWidget 继承自 QTableView 类
实例:
#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStringList>
#include <QDebug>
#include <QPushButton>
using namespace std;
class QMyLabel:public QLabel{
Q_OBJECT
public slots:
void rsetText(QTableWidgetItem * item);
};
void QMyLabel::rsetText(QTableWidgetItem * item){
this->setText(item->text());
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//创建一个窗口,作为输入框和列表框的父窗口
QWidget widget;
//设置窗口的标题
widget.setWindowTitle("QTableWidget控件");
//自定义窗口的大小
widget.resize(900,500);
//在 widget 窗口中添加一个 4 行 3 列的表格
QTableWidget TableWidget(4,3,&widget);
//自定义表格的尺寸和字体大小
TableWidget.resize(900,350);
TableWidget.setFont(QFont("宋体",20));
//设置表格中每一行的表头
TableWidget.setHorizontalHeaderLabels(QStringList() << "教程" << "网址" << "状态");
//设置表格数据区内的所有单元格都不允许编辑
TableWidget.setEditTriggers(QAbstractItemView::NoEditTriggers);
//设置表格中每一行的内容
TableWidget.setItem(0,0,new QTableWidgetItem("C语言教程"));
TableWidget.setItem(0,1,new QTableWidgetItem("http://c.biancheng.net/c/"));
TableWidget.setItem(0,2,new QTableWidgetItem("已更新完毕"));
TableWidget.setItem(1,0,new QTableWidgetItem("Qt教程"));
TableWidget.setItem(1,1,new QTableWidgetItem("http://c.biancheng.net/qt/"));
TableWidget.setItem(1,2,new QTableWidgetItem("正在更新"));
TableWidget.setItem(2,0,new QTableWidgetItem("C++教程"));
TableWidget.setItem(2,1,new QTableWidgetItem("http://c.biancheng.net/cplus/"));
TableWidget.setItem(2,2,new QTableWidgetItem("已更新完毕"));
//向 widget 窗口中添加一个文本框
QMyLabel lab;
lab.setText("选中单元格");
lab.setParent(&widget);
//自定义文本框的尺寸和位置
lab.resize(900,150);
lab.move(0,350);
lab.setAlignment(Qt::AlignCenter);
lab.setFont(QFont("宋体",16));
widget.show();
//为表格和文本框之间建立关联,当用户点击表格中某个单元格时,文本框显示单元格内的文本内容。
QObject::connect(&TableWidget,&QTableWidget::itemClicked,&lab,&QMyLabel::rsetText);
return a.exec();
}
//QMyLabel类的定义应该放到 .h 文件中,本例中将其写到 main.cpp 中,程序最后需要添加 #include "当前源文件名.moc" 语句,否则无法通过编译。
#include "main.moc"
结果: