Qt cpp 在WHaierBoardWorkshopAlarmList类中接收信号,获取到 QPixmap pixmap展示到表格第一列,获取到 当前时间展示到表格第二列,获取到数据信息,展示到表格第三列。 要求表格距离上边距 52 左右边距16px,下边距2px, 表格每行高度为80。表格无边框,无列边框。可以暂停刷新,在暂停刷新时,不改变数据,非暂停刷新时,可以从上到下显示最新的信息行。 最多显示100条最新信息行,如果是暂停刷新,不更新界面,但是要将最新数据 保存到成员变量,切换为刷新后,马上显示最新设备。 切换按钮位于(608,16)处。如何实现在信号发送频率很快的时候,高效显示,请给出该类的实现。
时间: 2024-04-24 22:22:27 浏览: 92
首先,我们可以使用QTableWidget来实现表格的显示。在WHaierBoardWorkshopAlarmList类的构造函数中创建一个QTableWidget实例,并设置它的相关属性,如下所示:
```
QTableWidget *tableWidget = new QTableWidget(this);
tableWidget->setGeometry(16, 52, width() - 32, height() - 54);
tableWidget->setRowCount(0);
tableWidget->setColumnCount(3);
tableWidget->setHorizontalHeaderLabels(QStringList() << tr("图片") << tr("时间") << tr("数据"));
tableWidget->verticalHeader()->setVisible(false);
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
tableWidget->setSelectionMode(QAbstractItemView::NoSelection);
tableWidget->setShowGrid(false);
tableWidget->setStyleSheet("QTableWidget{background-color:transparent;}");
```
接下来,我们在WHaierBoardWorkshopAlarmList类中定义一个槽函数,用来接收信号并更新表格数据。在该槽函数中,我们可以将接收到的图片数据转换成QPixmap对象,并将其插入到表格的第一列;将当前时间插入到表格的第二列;将接收到的数据信息插入到表格的第三列。同时,我们还需要将最新的数据保存到成员变量中。
```
void WHaierBoardWorkshopAlarmList::updateTableWidget(const QByteArray &imgData, const QString &data)
{
QPixmap pixmap;
pixmap.loadFromData(imgData);
QTableWidgetItem *itemPixmap = new QTableWidgetItem();
itemPixmap->setData(Qt::DecorationRole, pixmap);
itemPixmap->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
QTableWidgetItem *itemTime = new QTableWidgetItem();
itemTime->setText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
itemTime->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
QTableWidgetItem *itemData = new QTableWidgetItem();
itemData->setText(data);
itemData->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);
ui->tableWidget->setItem(row, 0, itemPixmap);
ui->tableWidget->setItem(row, 1, itemTime);
ui->tableWidget->setItem(row, 2, itemData);
ui->tableWidget->setRowHeight(row, 80);
ui->tableWidget->scrollToBottom();
// 保存最新数据到成员变量
AlarmData alarmData;
alarmData.imgData = imgData;
alarmData.time = itemTime->text();
alarmData.data = data;
m_alarmDataList.append(alarmData);
// 如果表格行数大于100,则删除最旧的数据行
if (ui->tableWidget->rowCount() > 100) {
ui->tableWidget->removeRow(0);
m_alarmDataList.removeFirst();
}
}
```
为了高效显示,我们可以使用QTimer定时器来刷新表格数据。在WHaierBoardWorkshopAlarmList类的构造函数中创建一个QTimer实例,并将其连接到updateTableWidget槽函数。
```
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &WHaierBoardWorkshopAlarmList::updateTableWidget);
timer->start(1000); // 设置定时器周期为1秒
```
当切换按钮被按下时,我们可以暂停定时器,同时将最新的数据保存到成员变量中。在恢复刷新时,我们将成员变量中保存的最新数据插入到表格中,并重新启动定时器。
```
void WHaierBoardWorkshopAlarmList::on_switchButton_clicked()
{
m_isPaused = !m_isPaused;
if (m_isPaused) {
// 暂停定时器
ui->switchButton->setText(tr("恢复刷新"));
m_timer->stop();
} else {
// 恢复定时器
ui->switchButton->setText(tr("暂停刷新"));
for (const AlarmData &alarmData : m_alarmDataList) {
updateTableWidget(alarmData.imgData, alarmData.data);
}
m_timer->start();
}
}
```
上述实现中,我们使用了一个QList来保存最新的数据,这样可以避免频繁地插入、删除表格行的操作,提高了效率。同时,在暂停刷新时,我们也可以保存最新的数据,并在恢复刷新时显示最新的数据。这样,在信号发送频率很快的情况下,我们可以高效地显示数据,并且可以暂停、恢复刷新,提高了灵活性。
阅读全文