1. QtableWidget
1.1 追加内容
- 在表格末端追加一行并且填入相关内容
- 在不清楚到底有多少数据的情况下,一般也不太好直接指定表格的长度,所以希望可以有类似append的方法可以直接在最后一行追加数据,思路如下
-
- 创建一个固定列数(比如说三列),行数为零的tableWidget
-
- 设置变量
int rowNums;
用rowNums = ui->tableWidget->rowCount();
获取当前的行数
- 设置变量
-
- 在rowNum行插入一行
ui->tableWidget->insertRow(rowNum);
- 在rowNum行插入一行
-
- 在新插入的行中填入数据,因为QTableWidget的表格索引行列都是从0开始的所以填入数据时行号直接就是rowNums
-
- 示例如下
//设置表格列数为3
ui->tableWidget->setColumnCount(3);
//设置表格的表头宽度自适应调整
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
//设置表头的内容
ui->tableWidget->setHorizontalHeaderLabels(QStringList()<<QString::fromLocal8Bit("第一列")<<QString::fromLocal8Bit("第二列")<<QString::fromLocal8Bit("第三列"));
//设置表格行数为0
ui->tableWidget->setRowCount(0);
//用变量rowNums来接收当前表格有多少行
rowNums=ui->tableWidget->rowCount();
//在第rowNums行插入一行表格
ui->tableWidget->insertRow(rowNums);
//在该行填入数据
ui->tableWidget->setItem(rowNums,0,new QTableWidgetItem(QString::fromLocal8Bit("一阵风")));
ui->tableWidget->setItem(rowNums,1,new QTableWidgetItem(QString::fromLocal8Bit("一棵树")));
ui->tableWidget->setItem(rowNums,2,new QTableWidgetItem(QString::fromLocal8Bit("一只猫")));
1.2 每次更新数据后让表格滑到最底部(显示最新内容)
- 方法一:在每次添加内容的代码后边加上
ui->tableWidget->scrollToBottom();
,但是这样添加内容过多时需要修改的地方太多 - 方法二:利用cellChanged在每次表格中有数据更新后自动滑到最底端,具体操作如下
-
- 在ui界面选中tableWidget右键转到槽选择cellChanged
-
- 在自动生成的槽函数中写入`ui->tableWidget>scrollToBottom();`,这样每次有数据更新后表格滑动条就会自动滑到最底端。
- 示例如下:
-
void MainWindow::on_tableWidget_cellChanged(int row, int column)
{
ui->tableWidget-->scrollToBottom();
}
1.3 当数据达到XX行后清空数据(即每次最多显示XX行)
- 当存储显示数据量较多时可能出现卡顿所以可以设置一下最多显示多少行
- 一开始查看手册发现
clearContents()
可以清空表格里的数据,便使用ui->tableWidget->clearContents();
准备来清空数据,但是这个方法只是清空了表格中的数据并没有删除表格。比如说我设置了达到20行后清空数据,调用这个函数后前二十行的数据是清空了,但是新的数据是从第二十一行开始的,而不是重新从第一行开始显示。 - 之前看到
clear()
方法也可以清空表格但是会把表头一起清除掉,所以才使用了clearContents()
,但是既然clearContents()
达不到想要的效果,那就试试clear()
没表头就没表头吧,但是使用了这个方法也和clearContents()
一样只清空了表格中的数据并没有删除表格,并且表头还变成了1 2 3。 - 好吧那就使用笨方法
ui->tableWidget->removeRow(row);
一行一行删除吧,当然也遇到了一些问题如下-
- 一开始我是直接从前往后删从第一行删到第二十行(由于QTableWiget索引是从0开始的准确的说是从
ui->tableWidget->removeRow(0);
…删到ui->tableWidget->removeRow(19);
),但这样总会最后留下一行后来想了想应该从后往前删,即从第二十行删到第一行(ui->tableWidget->removeRow(19);
…删到ui->tableWidget->removeRow(0);
)
- 一开始我是直接从前往后删从第一行删到第二十行(由于QTableWiget索引是从0开始的准确的说是从
-
- 删除的思路是先利用上文中提到的
cellChanged
槽函数,当表格中有数据变动时利用rowNums=ui->tableWidget->rowCount();
判断一下行数,当行数rowNums==21;
时清空表格。但是发现当写入第二十一行数据时,它虽然确实是把表格清空了并且把新的数据显示在了第一行,但是只显示了第一列的数据,第二第三列的数据并没有显示。
- 后来发现是我错误的认知导致了这个bug,因为看到
void MainWindow::on_tableWidget_cellChanged(int row, int column)
这个函数中带两个参数,所以我就在构造函数里写了on_tableWidget_cellChanged(rowNums, 2)
,便以为只有当最后一列数据变动时才触发这个槽函数。事实是加了这句也没什么用,每当表格数据有变动(不管是不是指定的第rowNums行, 第2列)时,都会触发void MainWindow::on_tableWidget_cellChanged(int row, int column)
槽函数。 - 所以当我在第二十一行第一列写入数据时触发了
void MainWindow::on_tableWidget-_cellChanged(int row, int column)
槽函数,它一判断行数rowNums==21;
就把表格清空了,导致后面两格的内容没有办法写入了。 - 所以在删除前先判断一下第20行最后一格的数据是否为空,当不为空时才执行清空操作,在利用
ui->tableWidget->item(20,2)->text()!=0
确认内容是否为空之前需要先确认ui->messageTable->item(20,2)!=NULL
指针是否存在,只有当指针存在时后再调用ui->tableWidget->item(20,2)->text()!=0
。
- 删除的思路是先利用上文中提到的
-
- 示例如下
void MainWindow::on_tableWidget_cellChanged(int row, int column)
{
ui->tableWidget->scrollToBottom();
if (ui->>tableWidget->rowCount()==21)
{
//在使用指针之前,进行指针是否为null的判断
if (ui->tableWidget->item(20,2)!=NULL)
{
//如果是在添加表格item时直接就填入了数据也可以不加这句判断
//但是涉及到设置颜色也会触发槽函数时还是得加上这句
if(ui->tableWidget->item(20,2)->text()!=0)
{
for (int i=19;i>-1;i--)
{
ui->tableWidget->removeRow(i);
qDebug()<<"i love coding"<<i;
}
}
}
}
}
1.4 设背景颜色
- 对部分表格设置背景色,需要先创建表格item再设置颜色
rowNums=ui->tableWidget->rowCount();
ui->tableWidget->insertRow(rowNums);
ui->tableWidget->setItem(rowNums,0,new QTableWidgetItem(QString::fromLocal8Bit("wind")));
ui->tableWidget->setItem(rowNums,1,new QTableWidgetItem(QString::fromLocal8Bit("tree")));
ui->tableWidget->setItem(rowNums,2,new QTableWidgetItem(QString::fromLocal8Bit("cat")));
ui->tableWidget->item(rowNums,0)->setBackground(Qt::red);
ui->tableWidget->item(rowNums,1)->setBackground(Qt::red);
ui->tableWidget->item(rowNums,2)->setBackground(Qt::red);
- 如果需要在设置颜色的基础上当数据达到XX行后清空数据,因为颜色设置也会触发void MainWindow::on_tableWidget-_cellChanged(int row, int column)`槽函数,所以需要对代码做以下修改(需要先设置表格item才能设置颜色,所以先将第rowNums行第2列设置为0,先设置背景颜色,再填入数据,这样当该格数据不为零了才清空表格。)
rowNums=ui->tableWidget->rowCount();
ui->tableWidget->insertRow(rowNums);
ui->tableWidget->setItem(rowNums,0,new QTableWidgetItem(QString::fromLocal8Bit("wind")));
ui->tableWidget->setItem(rowNums,1,new QTableWidgetItem(QString::fromLocal8Bit("tree")));
ui->tableWidget->item(rowNums,0)->setBackground(Qt::red);
ui->tableWidget->item(rowNums,1)->setBackground(Qt::red);
ui->tableWidget->setItem(tableRows,2,new QTableWidgetItem(0));
ui->tableWidget->item(rowNums,2)->setBackground(Qt::red);
ui->tableWidget->item(tableRows,2)->setText(QString::fromLocal8Bit("cat"));
1.5 表格设置
1.5.1 表格禁止编辑
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
1.5.2 隔行变色
ui->tableWidget->setAlternatingRowColors(true);
ui->tableWidget->setStyleSheet("QTableView::item:alternate:!selected, QTableWidget::item:alternate:!selected, QListView::item:alternate:!selected { background: rgb(30,144,255); } "
"QTableView::item:!alternate:!selected, QTableWidget::item:!alternate:!selected, QListView::item:!alternate:!selected { background: rgb(135,206,255); }");
1.5.3 水平/垂直表头拉伸
//水平表头
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
//垂直表头
ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
1.5.4 设置表头的字体和颜色
ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(255, 255, 255);font: 25 12pt 'Microsoft YaHei UI';color: black;};");
ui->tableWidget->verticalHeader()->setStyleSheet("QHeaderView::section{background:rgb(255, 255, 255);font: 25 12pt 'Microsoft YaHei UI';color: black;};");
1.5.5 设置表头分割线
//为水平表头设置分隔线
ui->tableWidget->horizontalHeader()->setStyleSheet(
"QHeaderView::section{"
"border-top:0px solid #E5E5E5;"
"border-left:0.5px solid #E5E5E5;"
"border-right:0px solid #E5E5E5;"
"border-bottom: 0.5px solid #E5E5E5;"
"background-color:white;"
"padding:4px;"
"}"
);
//为垂直表头设置分隔线
ui->tableWidget->verticalHeader()->setStyleSheet(
"QHeaderView::section{"
"border-top:0.5px solid #E5E5E5;"
"border-left:0.5px solid #E5E5E5;"
"border-right:0.5px solid #E5E5E5;"
"border-bottom: 0px solid #E5E5E5;"
"background-color:white;"
"padding:4px;"
"}"
);
1.5.6 表头字体粗体
QFont font ;//定义一个字体变量
font.setBold(true); //设置粗体
ui->tableWidget->horizontalHeader()->setFont(font);//把字体变量属性加进表头中
ui->tableWidget->verticalHeader()->setFont(font);
2. QListWidget
2.1 追加内容
- 这个就比较方便了,直接在要添加内容的地方使用addItem即可
ui->listWidget->addItem(QString::fromLocal8Bit("树和猫"));
2.2 滑动到最底端
- 每次添加内容后加上
ui->listWidget->scrollToBottom();
2.3 清空内容
ui->listWidget->takeItem(0);
或者ui->listWidget->clear();
都可以
2.4 设置每行交替颜色
ui->listWidget->setStyleSheet("QTableView::item:alternate:!selected, QTableWidget::item:alternate:!selected, QListView::item:alternate:!selected { background: lightYellow; } "
"QTableView::item:!alternate:!selected, QTableWidget::item:!alternate:!selected, QListView::item:!alternate:!selected { background: lightBlue; }");
3. QTextEdit
3.1 追加内容
ui->textEdit->append(QString::fromLocal8Bit("树和猫"));
3.2 更新内容后滑动到最底端
void MainWindow::on_textEdit_textChanged()
{
ui->textEdit_Recv->moveCursor(QTextCursor::End);
}
3.3 清空内容
ui->textEdit->setText("");
或者ui->textEdit->clear();
3.4 设置颜色
//方法一:
//改变颜色前先记录一下当前的颜色方便后面改回
auto cur_text_color =ui->textEdit->textColor();
//将颜色设置为红色
ui->textEdit->setTextColor(Qt::red);
//在将颜色改回来之前添加的文本颜色都是红色
ui->textEdit->append(QString::fromLocal8Bit("树"));
ui->textEdit->append(QString::fromLocal8Bit("猫"));
//将颜色改回为原本的颜色
ui->textEdit->setTextColor(cur_text_color);
//方法二:
//直接对添加的文本设置颜色
ui->textEdit->append(QString::fromLocal8Bit("<font color=\"#ff0000\">树和猫</font>"));
3.5 读取文本框中的所有内容
QString str = ui->textEdit->toPlainText();
4. QLineEdit
4.1 写入内容
ui->lineEdit->setText("127.0.0.1");
4.2 清空内容
ui->lineEdit->clear();