Files
EJM_Display/Pages/P12_NetworkPage.cpp
2025-10-10 17:44:10 +08:00

264 lines
9.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "P12_NetworkPage.h"
#include "ui_P12_NetworkPage.h"
#include <QPropertyAnimation>
#include <QLabel>
#include <QPixmap>
#include <QVBoxLayout>
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<QStringList> 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<QString> 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(&currentPx);
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);
}