Qt基础学习笔记02

常用界面设计组件

Qt类库为应用程序设计提供了大量的类,本章主要介绍设计GUI应用程序常用的各种界面组件的使用,这些是设计GUI应用程序的基础。

字符串与输人输出

字符串与数值之间的转换

QString类从字符串转换为整数的函数有:

这些函数如果不设置参数,缺省表示从十进制表示的字符串转换为整数:若指定整数基参数,
还可以直接将二进制、十六进制字符串转换为整数。

QString将字符串转换为浮点数的函数有:

在得到单价和数量后做相乘运算,得到计算结果变量total,再将此数值显示在编辑框editTotal中。由于计算结果是浮点数,希望显示两位小数,下面4行语句都可以实现这个功能。

进制转换

下面是读取二进制字符串,然后转换为十进制和十六进制显示的按钮的槽函数代码。

QString的常用功能

QString是Qt编程中常用的类,除了用作数字量的输入输出之外,QString还有很多其他功能,熟悉这些常见的功能,有助于灵活地实现字符串处理功能。
QString存储字符串采用的是Unicode码,每一个字符是一个l6位的QChar,.而不是8位的char,所以QString处理中文字符没有问题,而且一个汉字算作是一个字符。

SpinBox的使用

QSpinBox用于整数的显示和输入,一般显示十进制数,也可以显示二进制、十六进制的数,而且可以在显示框中增加前缀或后缀。
QDoubleSpinBox用于浮点数的显示和输入,可以设置显示小数位数,也可以设置显示的前缀和后缀。

其他数值输人和显示组件

时间日期与定时器

时间日期相关的类

Qt中的定时器类是QTimer,它直接从QObject类继承而来,不是界面组件类。

日期时间数据与字符串之间的转换

时间格式转字符串:

字符串转时间格式

静态函数QDateTime::fromString(将一个字符串按照格式转换为日期时间类型

这里将字符串str按照格式"yyyy-MM-ddhh:mm:ss"转换为日期时间变量,格式是指字符串str所表示的日期时间的格式。

定时器的使用

Qt中的定时器类是QTimer。QTimer不是一个可见的界面组件,在UI设计器的组件面板里找不到它。实例程序实现了一个计时器的功能,就是计算定时器开始到停止持续的时间长度,计时器是QTime类。

QTimer主要的属性是interval,是定时中断的周期,单位毫秒。QTimer主要的信号是timeout(),在定时中断时发射此信号,要想在定时中断里做出响应,这就需要编写timeout()信号的槽函数。

QComboBox QPlainTextEdit

QComboBox是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个QLineEdit用作输入。QComboBox除了显示可见下拉列表外,每个项(item,或称列表项)还可以关联一个QVariant类型的变量,用于存储一些不可见数据。

QPlainTextEdit是一个多行文本编辑器,用于显示和编辑多行简单文本。

QComboBox

添加具有用户数据的项

1
ui->comboBox->addItem("tes","200");
1
QString zone = ui->comboBox->currentData().toString();

QPlain TextEdit的使用

QPlainTextEdit是用于编辑多行文本的编辑器,可以编辑普通文本。另外,还有一个QTextEdit组件,是一个所见即所得的可以编辑带格式文本的组件,以HTML格式标记符定义文本格式。
从前面的代码已经看出,使用QPlainTextEdit:appendPlainText((const QString&text)函数就可以向PlainTextEdit组件添加一行字符串。

QPlainTextEdit提供cutO、copy()、paste()、undo()、redo()、clear()、selectAllO等标准编辑功能的槽函数,QPlainTextEdit还提供一个标准的右键快捷菜单。

但是如果要逐行读取QPlainTextEdit组件里的字符串,则稍微麻烦一点。

创建右键快捷菜单

  1. 创建Action

  2. 添加QListWidget

  3. QListWidget 转到槽

  4. 添加代码

  5. 效果

工具栏显式图片和文字

QTableWidget操作

  • 设置表头

1
2
3
4
5
6
7
8
9
10
11
12
13
QTableWidgetItem *headerItem;
QStringList headerText;
headerText << "姓名" << "性别" << "出生日期" << "民族" << "分数" << "是否党员";
ui->tableInfo->setColumnCount(headerText.count());
for (int i = 0;i < ui->tableInfo->columnCount(); i++) {
headerItem = new QTableWidgetItem(headerText.at(i));
QFont font = headerItem->font();
font.setBold(true);
font.setPointSize(12);
headerItem->setForeground(Qt::red);
headerItem->setFont(font);
ui->tableInfo->setHorizontalHeaderItem(i,headerItem);
}

  • 初始化表格数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    //初始化表格数据
    void MainWindow::on_butIniData_clicked()
    {
    QString strName,strSex;
    bool isParty = false;
    QDate birth;
    birth.setDate(1980,3,6);
    //清除表格数据区的所有内容,但是不清除表头
    ui->tableInfo->clearContents();
    //返回表格数据区的行数
    int Rows = ui->tableInfo->rowCount();
    qDebug() << Rows;

    for (int i = 0;i < Rows; i++) {
    strName = QString::asprintf("学生%d",i);
    if((i % 2) == 0){
    strSex = "男";
    }else {
    strSex = "女";
    }

    createItemsARow(i,strName,strSex,birth,"汉族",isParty,70);
    birth = birth.addDays(20);
    isParty = !isParty;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    void MainWindow::createItemsARow(int rowNo, QString Name, QString Sex, QDate birth, QString Nation, bool isPM, int score){

    QTableWidgetItem *item;
    QString str;
    uint StudID = 2022120600;
    //姓名
    item = new QTableWidgetItem(Name,MainWindow::ctName);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    StudID += rowNo;
    item->setData(Qt::UserRole,QVariant(StudID));
    ui->tableInfo->setItem(rowNo,MainWindow::colName,item);
    //性别
    QIcon icon;
    if(Sex == "男"){
    icon.addFile("");
    }else {
    icon.addFile("");
    }
    item = new QTableWidgetItem(Sex,MainWindow::ctSex);
    item->setIcon(icon);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,MainWindow::colSex,item);

    //出生日期
    str = birth.toString("yyyy-MM-dd");
    item = new QTableWidgetItem(str,MainWindow::ctBirth);
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,MainWindow::colBirth,item);

    //民族
    item = new QTableWidgetItem(Nation,MainWindow::ctNation);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,MainWindow::colNation,item);

    //是否是党员
    item = new QTableWidgetItem("党员",MainWindow::ctPartyM);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    if(isPM){
    item->setCheckState(Qt::Checked);
    }else {
    item->setCheckState(Qt::Unchecked);
    }
    item->setBackground(Qt::yellow);
    ui->tableInfo->setItem(rowNo,MainWindow::colPartyM,item);

    //分数
    str.setNum(score);
    item = new QTableWidgetItem(str,MainWindow::ctScore);
    item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
    ui->tableInfo->setItem(rowNo,MainWindow::colScore,item);

    }

  • 获得当前单元格数据

1
2
3
4
5
6
7
8
9
10
11
12
13
void MainWindow::on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
{
QTableWidgetItem *item = ui->tableInfo->item(currentRow,currentColumn);
if(item == NULL){
return;
}
labCellIndex->setText(QString::asprintf("当前单元格坐标:%d行,%d列",currentRow,currentColumn));
int cellType = item->type();
labCellType->setText(QString::asprintf("当前单元格类型:%d",cellType));
item = ui->tableInfo->item(currentRow,MainWindow::colName);
int ID = item->data(Qt::UserRole).toInt();
labStudID->setText(QString::asprintf("学生ID:%d",ID));
}

  • 插入、添加、删除行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //插入行
    void MainWindow::on_btnInsertRow_clicked()
    {
    int curRow = ui->tableInfo->currentRow();
    ui->tableInfo->insertRow(curRow);
    createItemsARow(curRow,"新生","男",QDate::fromString("1992-2-2","yyyy-M-d"),"苗族",true,0);

    }

    //添加行
    void MainWindow::on_btnAppendRow_clicked()
    {
    int curRow = ui->tableInfo->rowCount();
    ui->tableInfo->insertRow(curRow);
    createItemsARow(curRow,"新生","女",QDate::fromString("1994-2-3","yyyy-M-d"),"满族",true,0);
    }

    //删除当前行
    void MainWindow::on_btnDelCurRow_clicked()
    {
    int curRow = ui->tableInfo->currentRow();
    ui->tableInfo->removeRow(curRow);
    }
  • 自动调整行高和列宽

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void MainWindow::on_autoAdRowH_clicked()
    {
    int row = ui->tableInfo->currentRow();
    qDebug() << row;
    if(row == -1){
    ui->tableInfo->resizeRowsToContents();
    }else if (row > -1) {
    ui->tableInfo->resizeRowToContents(row);
    }

    }

    void MainWindow::on_autoAdColH_clicked()
    {
    int row = ui->tableInfo->currentRow();
    if(row == -1){
    ui->tableInfo->resizeColumnsToContents();
    }else if (row > -1) {
    ui->tableInfo->resizeColumnToContents(row);
    }

    }

  • 其他属性

    • 设置表格内容是否可编辑

    • 设置行表头、列表头是否显示

    • 间隔行底色

    • 选择模式

  • 遍历表格读取数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    void MainWindow::on_btnReadToEdit_clicked()
    {
    QString str;
    QTableWidgetItem *cellItem;
    ui->textEdit->clear();
    for (int i = 0;i< ui->tableInfo->rowCount();i++) {
    str = QString::asprintf("第 %d 行",i + 1);
    for (int j = 0;j < ui->tableInfo->columnCount() -1; j++) {
    cellItem = ui->tableInfo->item(i,j);
    str = str + cellItem->text() + " ";
    }
    cellItem = ui->tableInfo->item(i,colPartyM);
    if(cellItem->checkState() == Qt::Checked){
    str = str + "党员";
    }else {
    str = str + "群众";
    }
    ui->textEdit->appendPlainText(str);
    }
    }

-------------本文结束感谢您的阅读-------------