本来上午还在想着把数据量用图来做,结果计划有变,现在回归到用表格做,就只用qt只带的控件做就够了,正式做之前,我先来回顾下大体要用到的控件。
QGroupBox
首先QGroupBox的父类是QWidget,然后我需要用到的也就是这个框框左上角一个标题,然后我在里面放上相关的数据量,QGroupBox有一个checkable属性,设置为true,就可以被选中或取消选中。通过槽函数
connect(ui->groupBox, &QGroupBox::toggled, receiver, SLOT(slot()) );
就可以让我实现一些选定功能
QTabWidget
同样是QWidget的子类,相当于是提供了可以切换的多个QWidget。
QTableView 和 QTableWidget
QTableView 和 QTableWidget我放在一起记录,因为当我第一次看到它们的时候就觉得是同一个东西
然后我就搜了下:
#QTableView是一个基于模型/视图架构的类,用于显示和编辑表格数据。它需要一个QAbstractItemModel模型来提供数据,并且可以自定义视图来显示数据。QTableView可以显示大量数据,因为它只在需要时才会加载数据,而不是一次性加载所有数据。
QTableWidget是一个基于QTableView的类,它是一个自包含的表格控件,可以直接添加、删除和编辑单元格。它不需要模型,因为它自己管理数据。QTableWidget适用于小型数据集,因为它会一次性加载所有数据。
因此,QTableView和QTableWidget的主要区别在于它们的数据模型和数据管理方式。QTableView需要一个模型来提供数据,而QTableWidget自己管理数据。QTableView适用于大型数据集,而QTableWidget适用于小型数据集。
按我目前的需求,我应该先用QTableWidget来做,那么我就接着考虑几个问题
1.我的数据怎么放在QTableWidget上面
首先我在ui中添加一个QTableWidget,然后直接在构造函数下如下代码
ui->tableWidget->setRowCount(3);
ui->tableWidget->setColumnCount(2);
// 设置表头
ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄");
// 设置数据
ui->tableWidget->setItem(0, 0, new QTableWidgetItem("张三"));
ui->tableWidget->setItem(0, 1, new QTableWidgetItem("20"));
ui->tableWidget->setItem(1, 0, new QTableWidgetItem("李四"));
ui->tableWidget->setItem(1, 1, new QTableWidgetItem("25"));
ui->tableWidget->setItem(2, 0, new QTableWidgetItem("王五"));
ui->tableWidget->setItem(2, 1, new QTableWidgetItem("30"));
然后我得到了这样的效果
我可以通过鼠标选择某一行或者某一格
2.怎么修改某一个格或者某一行的背景颜色
在构造函数中继续添加
QTableWidgetItem* item = new QTableWidgetItem("Hello");
item->setBackground(Qt::red);
ui->tableWidget->setItem(3, 0, item);
QTableWidgetItem* item1 = new QTableWidgetItem("Hello1");
item1->setBackground(QColor(0,255,0));
ui->tableWidget->setItem(3, 1, item1);
3.我想再加一列,让我可以去随时修改表格的背景颜色
双击修改背景颜色为红色
1.第一步我先把表格值可修改的功能关掉
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
显然,这一步是在dialog的构造函数里面写的
2.然后就是双击事件的响应,这个的去重写QTableWidget的mouseDoubleClickEvent函数,所以我选择先新建一个继承QTableWidget的类,然后在类里面重写:
class MyTableWidget : public QTableWidget
{
Q_OBJECT
public:
MyTableWidget(QWidget *parent = nullptr);
void mouseDoubleClickEvent(QMouseEvent *event) override{
QTableWidgetItem *item = currentItem();
if (item) {
item->setBackground(Qt::red);
}
QTableWidget::mouseDoubleClickEvent(event);
}
};
然后将ui中的QTableWidget提升为我自己的类,这样就可以了