QT--控件篇二

一、文本框

1. QLineEdit
  1. 文本框通常使用QLineEdit和QTextEdit这两个类来实现。
    • QLineEdit:用于单行文本输入。
    • QTextEdit:用于多行文本输入,可以包含丰富的文本格式。
  2. setText(QString txt);设置默认的显示内容,用QString text();获取用户输入文本内容
  3. setPlaceholderText(QString text): 设置占位符文本,底纹
  4. setReadOnly(bool readOnly): 设置是否只读。
  5. setEchoMode 是 QLineEdit 类中的一个方法,用于设置文本输入的显示模式。它可以控制输入文本的显示方式,例如:正常显示、密码输入等。QLineEdit 提供了四种回显模式:
    • Normal(默认模式):文本正常显示。
    • NoEcho:文本不显示。
    • Password:文本显示为密码格式(通常是圆点或星号)。
    • PasswordEchoOnEdit:文本在编辑时显示为密码格式,编辑完成后显示为正常文本。
    • ui->lineEdit->setEchoMode(QLineEdit::NoEcho);
  6. 在Qt中,文本框(QLineEdit)输入完成的信号是 editingFinished。这个信号在文本框失去焦点时或者用户按下回车键时发出。您可以使用这个信号来执行一些操作,例如验证输入或保存数据。
  7. 在Qt中,文本框(QLineEdit)的文本内容发生变化时,会发出 textChanged 信号。您可以使用这个信号来实时处理文本变化,例如动态验证输入或更新UI。
    QLineEdit::textChanged 信号:每当 QLineEdit 中的文本发生变化时发出。信号传递一个 QString 参数,表示当前的文本内容。
  8. const QString &text 是一个参数类型,它用于传递 QString 对象的常量引用。这意味着传递的是一个引用,而不是复制整个字符串,从而提高效率。而且const 表示字符串内容是常量,不能在槽函数中被修改。
  9. 范例
//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
  1. QTextEdit 是 Qt 中用于多行文本输入和显示的组件,它提供了比 QLineEdit 更丰富的功能,如支持文本格式化、图像显示等。
  2. setText(QString &str);设置默认文本
  3. QString toPlainText();//获取用户输入的内容,同text()
  4. 没有editingFinished方法,textChanged方法
  5. append 方法用于向文本框中追加新的文本内容。它通常用于在已有文本的末尾添加新的行或段落。这在需要动态向用户显示信息或日志时特别有用。
  6. 字符串格式小提示
 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
  1. 允许用户从多个选项中选择一个或多个选项,每个选项可以独立地选中或取消选中。
  2. 可以显示为选中(checked)或未选中(unchecked)的状态,用户可以通过点击复选框来改变其状态。
  3. 可以与文本标签一起显示,以便用户了解复选框选项的含义或用途。
  4. setChecked(bool r);//设置默认状态
  5. bool isChecked();//判断是否已经选中
  6. 信号:stateChanged(int r);//会传送一个参数0表示未选中,2表示选中,在使用槽函数时,要定义一个参数来接他,如下图
    在这里插入图片描述
2.单选框QRadioButton
  1. setTexxt(QString txt);设置显示内容
  2. setChecked(bool r); 设置是否被选中
  3. bool isCheck(); 查看是否被选中
  4. 信号:clicked() 当被点击的时候发出该信号,无论谁被点击都返回值1
3. 分组框QGroupBox(了解即可)
  1. QGroupBox用于将一组相关的小部件(如按钮、标签、文本框等)进行分组。这不仅在视觉上创建了一个明显的分隔,还提供了逻辑上的关联,使界面更加清晰和有条理。
  2. QGroupBox可以设置为可选状态(checkable),这样整个组框及其包含的所有小部件可以一起启用或禁用。这对于控制一组相关功能的启用/禁用非常方便。
  3. QGroupBox可以包含一个标题,描述其内部小部件的功能。这有助于用户快速理解组内小部件的用途。
  4. setTitle和title:设置和获取组框的标题。
  5. setCheckable和isCheckable:设置和获取组框是否可选。
  6. setChecked和isChecked:设置和获取组框的选择状态。
  7. setAlignment和alignment:设置和获取组框标题的对齐方式。
  8. setLayout:设置组框的布局管理器,用于管理其内部小部件的布局。
  9. 信号toggled:在组框的选择状态发生改变时发出信号。
4.下拉框
  1. 下拉框(也称为下拉菜单或组合框)是图形用户界面(GUI)中的一种控件,它允许用户从预定义的选项列表中进行选择。下拉框通常以一个紧凑的单行显示,点击之后会展开一个列表,显示所有可选项。用户可以通过点击列表中的项或使用键盘进行选择。
  2. 在Qt框架中,QComboBox类用于实现下拉框。
  3. addItem(QString name);//新增加的item名字
  4. addItems(QStringList list);//新增加的列表
  5. removeItem(int index);//删除第几个Item(从0开始算)
  6. int findText(QString name); 根据item名字找出他的位置
  7. QString itemText(int index) 根据位置找出名字
  8. currentIndexChanged
  • currentIndexChanged 是一个信号(signal),在 Qt 中常用于表示索引发生变化时发出的信号。它通常与下拉框(QComboBox)或者类似的控件一起使用。当用户改变了下拉框的选择时,这个信号就会被触发。
  • connect(ui->comboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(onTextSlotFun(int )));
  • 在这里插入图片描述
  • 因为connect新旧方法不同,有时候新方法会更难写,旧方法更方便
5.列表框
  1. 定义:列表框(QListWidget)是一个用于显示项目列表的 Qt 控件。它可以在单列中显示多个项目,并允许用户选择一个或多个项目。

  2. 对于列表框(QListWidget)而言,它也可以发出类似于 currentIndexChanged 的信号,用于指示当前选择项的变化。不过,列表框与下拉框(QComboBox)有所不同,因为列表框可以支持多选。因此,它使用的信号是 currentRowChanged,而不是 currentIndexChanged。

  3. 使用场景

  • 项目列表展示:展示文件列表、历史记录、选项列表等。
  • 选项选择:允许用户从预定义的选项中选择一个或多个。
  • 导航和导航:在导航面板中显示和管理导航链接或项目。
  1. 模式切换: 列表模式–图标模式
  • setViewMode(QListWidget::IconMode / QListWidget::ListMode );
  1. 信号
  • 点击某个item发出信号
    itemClicked(QListWidgetItem *item ); //item那个item被点it击了
  • 双击某个item发出信号
itemDoubleClicked(QListWidgetItem *item);
  1. 小item
  • 文本
    setText(QString name);
    QString text();
  • 图标
    setIcon( QIcon &map ); //QIcon表示 图标对象,要和具体的图标文件绑定
  1. item函数是QListWidget类的一个成员函数,用于获取指定行的项目(item)。这是一个非常有用的函数,可以通过行号(索引)访问列表中的项目。
  QListWidgetItem *item = listWidget->item(1); // 获取第二个项目(行号为1)
	QString str = ui->listWidget->item(2)->text();//获取第三个项目的文本
  1. takeItem函数是QListWidget类的一个成员函数,用于从列表中移除并返回指定行的项目。与item函数不同,takeItem函数会将项目从列表中移除,但不会自动删除项目对象,因此需要手动管理内存。
 QListWidgetItem *item = listWidget->takeItem(1); // 移除第二个项目(行号为1)
 delete item;
  1. 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中,创建控件时常见的两种方式是直接在类中定义控件(即成员变量)和在构造函数中动态创建控件。这两种方式在资源管理、代码组织和灵活性上有所不同。
在类中直接定义控件
  1. 这种方式在类的头文件中定义控件作为成员变量。这些控件在类的构造函数调用之前已经分配了内存。
  2. 优点
  • 简洁明了:控件的定义和声明在同一位置,代码更易读。
  • 自动管理:当Widget对象被销毁时,控件会自动销毁,不需要手动管理内存。
  1. 缺点:
  • 灵活性较低:所有控件在类实例化时就创建,无法在运行时动态调整。
class MyWidget : public QWidget {
public:
    MyWidget(QWidget *parent = nullptr) : QWidget(parent) {
        button = new QPushButton("Click Me", this);
        // 设置布局和其他初始化操作
    }

private:
    QPushButton *button;
};

在构造函数中动态创建控件
  1. 这种方式在构造函数中使用new关键字动态创建控件,并且通常使用指针来管理这些控件。
  2. 优点
  • 灵活性高:可以根据构造函数参数或运行时条件来创建不同的控件。
  • 延迟初始化:控件的创建和初始化可以推迟到需要时,节省资源。
  1. 缺点
  • 内存管理:需要手动管理内存,确保在析构函数中正确释放,否则会导致内存泄漏。
  • 代码复杂度增加:需要更多的代码来管理指针和内存。
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不用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值