一、文本框
1. QLineEdit
- 文本框通常使用QLineEdit和QTextEdit这两个类来实现。
- QLineEdit:用于单行文本输入。
- QTextEdit:用于多行文本输入,可以包含丰富的文本格式。
- 用
setText(QString txt);
设置默认的显示内容,用QString text();
获取用户输入文本内容 - 用
setPlaceholderText(QString text)
: 设置占位符文本,底纹 setReadOnly(bool readOnly)
: 设置是否只读。- setEchoMode 是 QLineEdit 类中的一个方法,用于设置文本输入的显示模式。它可以控制输入文本的显示方式,例如:正常显示、密码输入等。QLineEdit 提供了四种回显模式:
- Normal(默认模式):文本正常显示。
- NoEcho:文本不显示。
- Password:文本显示为密码格式(通常是圆点或星号)。
- PasswordEchoOnEdit:文本在编辑时显示为密码格式,编辑完成后显示为正常文本。
ui->lineEdit->setEchoMode(QLineEdit::NoEcho);
- 在Qt中,文本框(QLineEdit)输入完成的信号是 editingFinished。这个信号在文本框失去焦点时或者用户按下回车键时发出。您可以使用这个信号来执行一些操作,例如验证输入或保存数据。
- 在Qt中,文本框(QLineEdit)的文本内容发生变化时,会发出 textChanged 信号。您可以使用这个信号来实时处理文本变化,例如动态验证输入或更新UI。
QLineEdit::textChanged 信号:每当 QLineEdit 中的文本发生变化时发出。信号传递一个 QString 参数,表示当前的文本内容。 - const QString &text 是一个参数类型,它用于传递 QString 对象的常量引用。这意味着传递的是一个引用,而不是复制整个字符串,从而提高效率。而且const 表示字符串内容是常量,不能在槽函数中被修改。
- 范例
//widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
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 onTextChanged(const QString &text);
void onEditingFinished();
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
// 设置默认文本
ui->lineEdit->setText("Default Text");
// 设置占位符文本
ui->lineEdit->setPlaceholderText("Enter your text here...");
// 设置只读模式
// ui->lineEdit->setReadOnly(true);
// 设置回显模式
ui->lineEdit->setEchoMode(QLineEdit::Normal); // 也可以设置为 NoEcho, Password, PasswordEchoOnEdit
// 连接信号和槽
connect(ui->lineEdit, &QLineEdit::textChanged, this, &Widget::onTextChanged);
//connect(ui->lineEdit,SIGNAL(textChanged(const QString &)),this,SLOT(onTextChanged(const QString &)));
//还是新方法好用,至少不用槽函数的签名匹配那么严格,只填写函数。
connect(ui->lineEdit, &QLineEdit::editingFinished, this, &Widget::onEditingFinished);
}
Widget::~Widget()
{
delete ui;
}
void Widget::onTextChanged(const QString &text)
{
qDebug() << "Text changed:" << text;
}
void Widget::onEditingFinished()
{
QString text = ui->lineEdit->text();
qDebug() << "Editing finished. Text:" << text;
}
2. QTextEdit
- QTextEdit 是 Qt 中用于多行文本输入和显示的组件,它提供了比 QLineEdit 更丰富的功能,如支持文本格式化、图像显示等。
- setText(QString &str);设置默认文本
- QString toPlainText();//获取用户输入的内容,同text()
- 没有editingFinished方法,textChanged方法
- append 方法用于向文本框中追加新的文本内容。它通常用于在已有文本的末尾添加新的行或段落。这在需要动态向用户显示信息或日志时特别有用。
- 字符串格式小提示
printf("today temp=%d shidu=%d des=%s\n",12,45,"good day");
qt特有的 格式化放那格式
QString str = QString("usrname=%1 passwd=%2 des=%3 .").arg( "xiao").arg("123").arg("xx");
二、选择框
1. 复选框QCheckBox
- 允许用户从多个选项中选择一个或多个选项,每个选项可以独立地选中或取消选中。
- 可以显示为选中(checked)或未选中(unchecked)的状态,用户可以通过点击复选框来改变其状态。
- 可以与文本标签一起显示,以便用户了解复选框选项的含义或用途。
- setChecked(bool r);//设置默认状态
- bool isChecked();//判断是否已经选中
- 信号:stateChanged(int r);//会传送一个参数0表示未选中,2表示选中,在使用槽函数时,要定义一个参数来接他,如下图
2.单选框QRadioButton
- setTexxt(QString txt);设置显示内容
- setChecked(bool r); 设置是否被选中
- bool isCheck(); 查看是否被选中
- 信号:clicked() 当被点击的时候发出该信号,无论谁被点击都返回值1
3. 分组框QGroupBox(了解即可)
- QGroupBox用于将一组相关的小部件(如按钮、标签、文本框等)进行分组。这不仅在视觉上创建了一个明显的分隔,还提供了逻辑上的关联,使界面更加清晰和有条理。
- QGroupBox可以设置为可选状态(checkable),这样整个组框及其包含的所有小部件可以一起启用或禁用。这对于控制一组相关功能的启用/禁用非常方便。
- QGroupBox可以包含一个标题,描述其内部小部件的功能。这有助于用户快速理解组内小部件的用途。
- setTitle和title:设置和获取组框的标题。
- setCheckable和isCheckable:设置和获取组框是否可选。
- setChecked和isChecked:设置和获取组框的选择状态。
- setAlignment和alignment:设置和获取组框标题的对齐方式。
- setLayout:设置组框的布局管理器,用于管理其内部小部件的布局。
- 信号toggled:在组框的选择状态发生改变时发出信号。
4.下拉框
- 下拉框(也称为下拉菜单或组合框)是图形用户界面(GUI)中的一种控件,它允许用户从预定义的选项列表中进行选择。下拉框通常以一个紧凑的单行显示,点击之后会展开一个列表,显示所有可选项。用户可以通过点击列表中的项或使用键盘进行选择。
- 在Qt框架中,QComboBox类用于实现下拉框。
- addItem(QString name);//新增加的item名字
- addItems(QStringList list);//新增加的列表
- removeItem(int index);//删除第几个Item(从0开始算)
- int findText(QString name); 根据item名字找出他的位置
- QString itemText(int index) 根据位置找出名字
- currentIndexChanged
- currentIndexChanged 是一个信号(signal),在 Qt 中常用于表示索引发生变化时发出的信号。它通常与下拉框(QComboBox)或者类似的控件一起使用。当用户改变了下拉框的选择时,这个信号就会被触发。
connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onTextSlotFun(int )));
- 因为connect新旧方法不同,有时候新方法会更难写,旧方法更方便
5.列表框
-
定义:列表框(QListWidget)是一个用于显示项目列表的 Qt 控件。它可以在单列中显示多个项目,并允许用户选择一个或多个项目。
-
对于列表框(QListWidget)而言,它也可以发出类似于 currentIndexChanged 的信号,用于指示当前选择项的变化。不过,列表框与下拉框(QComboBox)有所不同,因为列表框可以支持多选。因此,它使用的信号是 currentRowChanged,而不是 currentIndexChanged。
-
使用场景
- 项目列表展示:展示文件列表、历史记录、选项列表等。
- 选项选择:允许用户从预定义的选项中选择一个或多个。
- 导航和导航:在导航面板中显示和管理导航链接或项目。
- 模式切换: 列表模式–图标模式
setViewMode(QListWidget::IconMode / QListWidget::ListMode );
- 信号
- 点击某个item发出信号
itemClicked(QListWidgetItem *item );
//item那个item被点it击了 - 双击某个item发出信号
itemDoubleClicked(QListWidgetItem *item);
- 小item
- 文本
setText(QString name);
QString text(); - 图标
setIcon( QIcon &map ); //QIcon表示 图标对象,要和具体的图标文件绑定
- item函数是QListWidget类的一个成员函数,用于获取指定行的项目(item)。这是一个非常有用的函数,可以通过行号(索引)访问列表中的项目。
QListWidgetItem *item = listWidget->item(1); // 获取第二个项目(行号为1)
QString str = ui->listWidget->item(2)->text();//获取第三个项目的文本
- takeItem函数是QListWidget类的一个成员函数,用于从列表中移除并返回指定行的项目。与item函数不同,takeItem函数会将项目从列表中移除,但不会自动删除项目对象,因此需要手动管理内存。
QListWidgetItem *item = listWidget->takeItem(1); // 移除第二个项目(行号为1)
delete item;
- currentRow 是 QListWidget 类中的一个成员函数,用于获取当前选中的行号。如果没有选中任何行,则返回 -1。这个函数非常有用,可以在用户与列表交互时确定当前选择的项目。
//widget.h
#ifndef MYWIDGET_H
#define MYWIDGET_H
#include <QWidget>
#include <QListWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
class Widget : public QWidget {
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
private slots:
void handleButtonClick();
private:
QListWidget *listWidget;
QPushButton *button;
QLabel *label;
};
#endif // MYWIDGET_H
//widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include "Widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent), listWidget(new QListWidget(this)), button(new QPushButton("Show Current Row", this)), label(new QLabel(this)) {
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(listWidget);
layout->addWidget(button);
layout->addWidget(label);
// 添加项目到列表框
listWidget->addItem("Item 1");
listWidget->addItem("Item 2");
listWidget->addItem("Item 3");
connect(button, &QPushButton::clicked, this, &Widget::handleButtonClick);
}
void Widget::handleButtonClick() {
int row = listWidget->currentRow(); // 获取当前选中的行号
if (row != -1) {
label->setText(QString("Current Row: %1").arg(row));
} else {
label->setText("No item selected");
}
}
三、在类中定义控件(即成员变量)和在构造函数中创建控件
- 在Qt中,创建控件时常见的两种方式是直接在类中定义控件(即成员变量)和在构造函数中动态创建控件。这两种方式在资源管理、代码组织和灵活性上有所不同。
在类中直接定义控件
- 这种方式在类的头文件中定义控件作为成员变量。这些控件在类的构造函数调用之前已经分配了内存。
- 优点
- 简洁明了:控件的定义和声明在同一位置,代码更易读。
- 自动管理:当Widget对象被销毁时,控件会自动销毁,不需要手动管理内存。
- 缺点:
- 灵活性较低:所有控件在类实例化时就创建,无法在运行时动态调整。
class MyWidget : public QWidget {
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
button = new QPushButton("Click Me", this);
// 设置布局和其他初始化操作
}
private:
QPushButton *button;
};
在构造函数中动态创建控件
- 这种方式在构造函数中使用new关键字动态创建控件,并且通常使用指针来管理这些控件。
- 优点
- 灵活性高:可以根据构造函数参数或运行时条件来创建不同的控件。
- 延迟初始化:控件的创建和初始化可以推迟到需要时,节省资源。
- 缺点
- 内存管理:需要手动管理内存,确保在析构函数中正确释放,否则会导致内存泄漏。
- 代码复杂度增加:需要更多的代码来管理指针和内存。
class MyWidget : public QWidget {
public:
MyWidget(QWidget *parent = nullptr)
: QWidget(parent)
, ui(new Ui::Widget) {
ui->setupUi(this);
QListWidgetItem *ptItem = new QListWidgetItem;
// 其他控件的初始化
QListWidgetItem *item1 =new QListWidgetItem("计算器");
}
~MyWidget() {
delete ui;
}
private:
Ui::Widget *ui;
};
结论
- 在类中直接定义控件:适用于控件固定且数量不多的情况,代码简洁,易于维护。
- 在构造函数中动态创建控件:适用于控件的数量和类型需要根据条件动态确定的情况,灵活性更高,但需要小心管理内存。
- 总的来说,如果控件是固定的且不需要动态调整,直接在类中定义会更简洁和安全。如果需要动态创建控件,则可以在构造函数中动态分配内存,但要确保正确管理内存。
- 两种方式都要包含头文件,ui不用