#include "P12_NetworkPage.h" #include "ui_P12_NetworkPage.h" #include #include #include #include class ReadOnlyItem : public QTableWidgetItem { public: explicit ReadOnlyItem(const QString &text) : QTableWidgetItem(text) { setFlags(flags() & ~Qt::ItemIsEditable); // 去掉可编辑标志 } }; P12_NetworkPage::P12_NetworkPage(QWidget *parent) : QWidget(parent), ui(new Ui::P12_NetworkPage) { ui->setupUi(this); WinInit(); ui->MainWidget->setCurrentIndex(0); mCsvConfig[0].FileName = "./ProgramConfig/UI_IO扩展页面1_配置.csv"; mCsvConfig[1].FileName = "./ProgramConfig/UI_IO扩展页面2_配置.csv"; mCsvConfig[2].FileName = "./ProgramConfig/UI_IO扩展页面3_配置.csv"; gPageIndexStr12 = "P12.00"; TableViewInit(ui->TableWidget_PLC_1,&mCsvConfig[0]); TableViewInit(ui->TableWidget_PLC_2,&mCsvConfig[1]); TableViewInit(ui->TableWidget_PLC_3,&mCsvConfig[2]); // 2. 向模型添加数据 // ModelPage1->setItem(0, 0, new QStandardItem("张三")); // ModelPage1->setItem(0, 1, new QStandardItem("25")); // ModelPage1->setItem(1, 0, new QStandardItem("李四")); // ModelPage1->setItem(1, 1, new QStandardItem("30")); // ModelPage1->setItem(2, 0, new QStandardItem("王五")); // ModelPage1->setItem(2, 1, new QStandardItem("28")); } P12_NetworkPage::~P12_NetworkPage() { delete ui; } void P12_NetworkPage::WinInit() { //所用定时器初始化 QTimer* UIRefresh_Timer = new QTimer(this); connect(UIRefresh_Timer, &QTimer::timeout, this, &P12_NetworkPage::UIRefreshTimeOut); UIRefresh_Timer->setInterval(100); // 设置定时器间隔为 1000 毫秒(1 秒) UIRefresh_Timer->start(); } void P12_NetworkPage::TableViewInit( QTableWidget *tw,tsCsvConfigText *CCT){ tw->move(2,5); tw->setSizeIncrement(1023,512); tw->setRowCount(16); tw->setColumnCount(15); tw->horizontalHeader()->setVisible(false); tw->verticalHeader()->setVisible(false); tw->horizontalHeader()->setMinimumSectionSize(0); for (uint8_t i=0; i<16;i++) { tw->setRowHeight(i,32); } for (int i=0;i<4;i++) { //qDebug()<<0+i*4<<1+i*4<<2+i*4<<3+i*4; tw->setColumnWidth(0+i*4, 42); // 60+200+10+ tw->setColumnWidth(1+i*4, 150); tw->setColumnWidth(2+i*4, 60); if(3+i*4<15) tw->setColumnWidth(3+i*4, 4); } QList FileData = ConfigFiles().ReadFile_Csv(CCT->FileName); for (int row = 1; row < FileData.size()-1; ++row) { CCT->Type.append(FileData.at(row)[1]); CCT->PinName.append(FileData.at(row)[2]); QString Text = FileData.at(row)[3]; Text.replace("\\n","\n",Qt::CaseInsensitive); CCT->ShowText.append(Text); CCT->TColor.append(FileData.at(row)[4]); CCT->FColor.append(FileData.at(row)[5]); CCT->DataNode.append(FileData.at(row)[6]); } for (uint8_t i=0;i<16;i++) { tw->setItem(i,0,new ReadOnlyItem(CCT->PinName[i])); tw->setItem(i,1,new ReadOnlyItem(CCT->ShowText[i])); tw->setItem(i,4,new ReadOnlyItem(CCT->PinName[i+16])); tw->setItem(i,5,new ReadOnlyItem(CCT->ShowText[i+16])); tw->setItem(i,8,new ReadOnlyItem(CCT->PinName[i+32])); tw->setItem(i,9,new ReadOnlyItem(CCT->ShowText[i+32])); tw->setItem(i,12,new ReadOnlyItem(CCT->PinName[i+32])); tw->setItem(i,13,new ReadOnlyItem(CCT->ShowText[i+32])); } } void P12_NetworkPage::TableViewDataUpdate( QTableWidget *tw,tsCsvConfigText *CCT){ for (uint8_t i=0;i<16;i++) { for (uint8_t j=0;j<4;j++) { uint8_t Index = i+j*16; if(CCT->Type[Index] == "数值"){ tw->setItem(i,2+j*4,new ReadOnlyItem(variantToFormattedString(gOPC_NodeValue[CCT->DataNode[Index]],2))); }else if(CCT->Type[Index] != ""){ QList NodeId = CCT->DataNode[Index].split("#"); bool TmpBool = getBitOf32Data(gOPC_NodeValue[NodeId[0]].toUInt(),NodeId[1].toInt()); tw->setItem(i,2+j*4,makeColorItem(CCT->Type[Index],TmpBool,CCT->FColor[Index],CCT->TColor[Index])); } } } } inline QColor parseCssColor(const QString &css) { // 从 "color: rgb(r, g, b);" 或 "rgb(r, g, b)" 里抠出 r,g,b static QRegularExpression re(R"(rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\))"); auto m = re.match(css); if (m.hasMatch()) return QColor(m.captured(1).toInt(), m.captured(2).toInt(), m.captured(3).toInt()); return Qt::black; // 兜底 } inline QTableWidgetItem *P12_NetworkPage::makeColorItem(const QString &Type, const bool Color, const QString &Fcolor, const QString &TFcolor, bool editable) { QColor c; QString text; c = Color?parseCssColor(TFcolor):parseCssColor(Fcolor); if(Type == "输入") text = "●"; else if(Type == "输出") text = "■"; else text = "★"; QTableWidgetItem *item = new QTableWidgetItem(text); item->setForeground(QBrush(c)); item->setTextAlignment(Qt::AlignCenter); // 居中 QFont f = item->font(); f.setPointSize(20); item->setFont(f); if (!editable) item->setFlags(item->flags() & ~Qt::ItemIsEditable); return item; } void P12_NetworkPage::UIRefresh_Page0(){} void P12_NetworkPage::UIRefresh_Page1(){ } void P12_NetworkPage::UIRefresh_Page2(){} void P12_NetworkPage::UIRefresh_Page3(){} void P12_NetworkPage::UIRefresh_Page4(){} void P12_NetworkPage::UIRefresh_Page5(){} void P12_NetworkPage::UIRefresh_Page6(){} void P12_NetworkPage::UIRefresh_Page7(){} void P12_NetworkPage::UIRefresh_Page8(){} void P12_NetworkPage::UIRefresh_Page9(){} void P12_NetworkPage::UIRefreshTimeOut() { if(!gPageIndexStr.contains("P12")) return; switch (ui->MainWidget->currentIndex()) { case 0:UIRefresh_Page0();break; case 1:TableViewDataUpdate(ui->TableWidget_PLC_1,&mCsvConfig[0]);break; case 2:TableViewDataUpdate(ui->TableWidget_PLC_2,&mCsvConfig[1]);break; case 3:TableViewDataUpdate(ui->TableWidget_PLC_3,&mCsvConfig[2]);break; case 4:UIRefresh_Page4();break; case 5:UIRefresh_Page5();break; case 6:UIRefresh_Page6();break; case 7:UIRefresh_Page7();break; case 8:UIRefresh_Page8();break; case 9:UIRefresh_Page9();break; } } void P12_NetworkPage::on_But_Network_0_clicked(){ slideToIndex(0, "P12.00");} void P12_NetworkPage::on_But_Network_1_clicked(){ slideToIndex(1, "P12.01");} void P12_NetworkPage::on_But_Network_2_clicked(){ slideToIndex(2, "P12.02");} void P12_NetworkPage::on_But_Network_3_clicked(){ slideToIndex(3, "P12.03");} void P12_NetworkPage::on_But_Network_4_clicked(){ slideToIndex(4, "P12.04");} void P12_NetworkPage::on_But_Network_5_clicked(){ slideToIndex(5, "P12.05");} void P12_NetworkPage::on_But_Network_6_clicked(){ slideToIndex(6, "P12.06");} void P12_NetworkPage::on_But_Network_7_clicked(){ slideToIndex(7, "P12.07");} void P12_NetworkPage::on_But_Network_8_clicked(){ slideToIndex(8, "P12.08");} void P12_NetworkPage::on_But_Network_9_clicked(){ slideToIndex(9, "P12.09");} void P12_NetworkPage::on_MainWidget_currentChanged(int arg1) { } void P12_NetworkPage::slideToIndex(int newIndex, QString PageName) { gPageIndexStr = PageName; gPageIndexStr12 = PageName; int direction =0; uint8_t OldIndex = ui->MainWidget->currentIndex(); if (newIndex == OldIndex) return; if(newIndex > OldIndex) direction = 1; else direction = -1; int oldIndex = ui->MainWidget->currentIndex(); QWidget *currentWidget = ui->MainWidget->widget(oldIndex); QWidget *nextWidget = ui->MainWidget->widget(newIndex); if (!currentWidget || !nextWidget) return; // 1. 截图 QPixmap currentPx(currentWidget->size()); currentWidget->render(¤tPx); QPixmap nextPx(nextWidget->size()); nextWidget->render(&nextPx); // 2. 临时层 QWidget *overlay = new QWidget(this); overlay->setGeometry(ui->MainWidget->geometry()); overlay->setStyleSheet("background: transparent;"); QLabel *oldLabel = new QLabel(overlay); oldLabel->setPixmap(currentPx); oldLabel->setFixedSize(currentWidget->size()); QLabel *newLabel = new QLabel(overlay); newLabel->setPixmap(nextPx); newLabel->setFixedSize(nextWidget->size()); newLabel->move(direction * currentWidget->width(), 0); overlay->raise(); overlay->show(); // 3. 动画 int dx = currentWidget->width(); QPropertyAnimation *animOld = new QPropertyAnimation(oldLabel, "pos"); animOld->setDuration(300); animOld->setStartValue(QPoint(0, 0)); animOld->setEndValue(QPoint(-direction * dx, 0)); QPropertyAnimation *animNew = new QPropertyAnimation(newLabel, "pos"); animNew->setDuration(300); animNew->setStartValue(QPoint(direction * dx, 0)); animNew->setEndValue(QPoint(0, 0)); connect(animNew, &QPropertyAnimation::finished, this, [=]() { ui->MainWidget->setCurrentIndex(newIndex); overlay->deleteLater(); }); animOld->start(QAbstractAnimation::DeleteWhenStopped); animNew->start(QAbstractAnimation::DeleteWhenStopped); }