常用界面设计组件
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组件里的字符串,则稍微麻烦一点。
创建右键快捷菜单
-
创建Action
-
添加QListWidget
-
QListWidget 转到槽
-
添加代码
-
效果
工具栏显式图片和文字
QTableWidget操作
-
设置表头
1 | QTableWidgetItem *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
52void 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 | void MainWindow::on_tableInfo_currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn) |
-
插入、添加、删除行
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
22void 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
20void 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);
}
}