活动介绍

代码void Index::on_pushButton_2_clicked(){ QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems(); int count = items.count(); if(count!=0){ printer=new QPrinter(); QSettings settings("./saveFile/printsetting.ini",QSettings::IniFormat); settings.setIniCodec("UTF8"); settings.beginGroup("/systemCfg"); int value2 = settings.value("getModeSelect1").toInt(); settings.endGroup(); if(value2==0){ printer->setOrientation(QPrinter::Portrait); printer->setPageSize(QPrinter::A5); } pd = new QPrintPreviewDialog(printer); pd->setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint); if(value2==0||value2==1){ connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(printPreview1(QPrinter*))); }else{ connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(printPreview(QPrinter*))); } pd->resize(800,1050); pd->exec(); delete pd; delete printer; } }中怎么使用QPrintPreviewDialog类的静态函数setDefaultPrinter()保留打印预览的设置

时间: 2024-03-26 10:39:16 浏览: 123
在上述代码中,可以在 `printer` 对象创建后,调用 `QPrintPreviewDialog::setDefaultPrinter(printer)` 来设置默认打印机。这样,在打印预览的时候,会自动使用该打印机。 具体实现可以在 `printer` 对象创建之后,添加如下代码: ```c++ QPrintPreviewDialog::setDefaultPrinter(printer); ``` 这样,打印预览对话框就会使用该打印机来进行预览和打印。同时,在程序退出时,可以在析构函数中调用 `QPrintPreviewDialog::resetDefaultPrinter()` 来重置默认打印机。 完整代码如下: ```c++ void Index::on_pushButton_2_clicked(){ QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems(); int count = items.count(); if(count!=0){ printer=new QPrinter(); QSettings settings("./saveFile/printsetting.ini",QSettings::IniFormat); settings.setIniCodec("UTF8"); settings.beginGroup("/systemCfg"); int value2 = settings.value("getModeSelect1").toInt(); settings.endGroup(); if(value2==0){ printer->setOrientation(QPrinter::Portrait); printer->setPageSize(QPrinter::A5); } // 设置默认打印机 QPrintPreviewDialog::setDefaultPrinter(printer); pd = new QPrintPreviewDialog(printer); pd->setWindowFlags(windowFlags()&~Qt::WindowContextHelpButtonHint); if(value2==0||value2==1){ connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(printPreview1(QPrinter*))); }else{ connect(pd,SIGNAL(paintRequested(QPrinter*)),this,SLOT(printPreview(QPrinter*))); } pd->resize(800,1050); pd->exec(); delete pd; delete printer; } } Index::~Index() { // 重置默认打印机 QPrintPreviewDialog::resetDefaultPrinter(); delete ui; } ```
阅读全文

相关推荐

#ifndef DIALOG_H #define DIALOG_H #include <QDialog> QT_BEGIN_NAMESPACE namespace Ui { class Dialog; } QT_END_NAMESPACE class QTimer; class Dialog : public QDialog { Q_OBJECT public: Dialog(QWidget *parent = nullptr); ~Dialog(); private slots: void onTime(); void on_pushButton_start_01_clicked(); void on_pushButton_end_01_clicked(); void on_pushButton_start_02_clicked(); void on_pushButton_end_02_clicked(); void on_pushButton_start_03_clicked(); void on_pushButton_end_03_clicked(); private: Ui::Dialog *ui; QTimer *timer_ = nullptr; bool time_1 = false; bool time_2 = false; bool time_3 = false; }; #endif // DIALOG_H #include "dialog.h" #include "ui_dialog.h" #include <QDateTime> #include <QTimer> #include <QMessageBox> #include <QDebug> Dialog::Dialog(QWidget *parent) : QDialog(parent) , ui(new Ui::Dialog) { ui->setupUi(this); timer_ = new QTimer (this); connect(timer_,&QTimer::timeout,this,&Dialog::onTime); timer_->start(1000); } Dialog::~Dialog() { delete ui; } void Dialog::onTime(){ auto time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"); qint64 current_ms = QDateTime::currentDateTime().currentMSecsSinceEpoch(); qint64 ms_1 = ui->dateTimeEdit_clock01->dateTime().toMSecsSinceEpoch(); qint64 ms_2 = ui->dateTimeEdit_clock_02->dateTime().toMSecsSinceEpoch(); qint64 ms_3 = ui->dateTimeEdit_clock_03->dateTime().toMSecsSinceEpoch(); qDebug() << "time" << ms_1; qDebug() << "time2" <<ms_2; qDebug() << "time3" <<ms_3; qDebug() << "current_ms" << current_ms; if(current_ms >= ms_1 && time_1 == false){ time_1 = true; QMessageBox::information(this,"闹钟1","闹钟1的时间到了"); } if(current_ms >= ms_2 && time_2 == false){ time_2 = true; QMessageBox::information(this,"闹钟2","闹钟2的时间到了"); } if(current_ms >= ms_3 && time_3 == false){ time_3 = true; QMessageBox::information(this,"闹钟3","闹钟3的时间到了"); } ui->lcdNumber_clock->display(time); } void Dialog::on_pushButton_start_01_clicked() { ui->dateTimeEdit_clock01->setReadOnly(true); time_1 = false; } void Dialog::on_pushButton_end_01_clicked() { QMessageBox box(QMessageBox::Warning,"Warning","是否要重新设闹钟",QMessageBox::Yes|QMessageBox::No); int ret = box.exec(); if(ret == QMessageBox::Yes){ ui->dateTimeEdit_clock01->setReadOnly(false); ui->dateTimeEdit_clock01->clear(); } } void Dialog::on_pushButton_start_02_clicked() { } void Dialog::on_pushButton_end_02_clicked() { } void Dialog::on_pushButton_start_03_clicked() { } void Dialog::on_pushButton_end_03_clicked() { } 怎么通过按钮start和end控制闹钟的开始与停止,要求显示当前的时间不修改,只修改的是显示闹钟的界面

.ui <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>600</height> </rect> <string>MainWindow</string> <widget class="QWidget" name="centralwidget"> <layout class="QGridLayout" name="gridLayout_2"> <item row="0" column="0"> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0" colspan="4"> <widget class="QTableView" name="tableView"/> </item> <item row="1" column="0" colspan="4"> <widget class="QTextEdit" name="textEdit"/> </item> <item row="2" column="0"> <widget class="QPushButton" name="pushButton"> <string>PushButton</string> </widget> </item> <item row="2" column="1"> <widget class="QPushButton" name="pushButton_2"> <string>PushButton</string> </widget> </item> <item row="2" column="2"> <widget class="QPushButton" name="pushButton_3"> <string>PushButton</string> </widget> </item> <item row="2" column="3"> <widget class="QPushButton" name="pushButton_4"> <string>PushButton</string> </widget> </item> </layout> </item> </layout> </widget> <widget class="QMenuBar" name="menubar"> <rect> <x>0</x> <y>0</y> <width>800</width> <height>22</height> </rect> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui> 根据既有ui完善和更正cpp,最主要的是数据库中提取的数据一点要到已经建立好的textedit上,不要新建,其他可能问题自行查找并改出 mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h" #include <QFileDialog> #include <QTextStream> #include <QMessageBox> #include <QFont> #include <QItemSelectionModel> #include <QHeaderView> #include <QSqlQuery> #include <QSqlError> #include <QAbstractItemModel> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化数据库 loadDatabase(); // 设置模型到TableView ui->tableView->setModel(sqlModel); // 初始化文本编辑器 textEdit = new QTextEdit(this); // 创建状态栏组件 LabCurFile = new QLabel("当前文件:", this); LabCellPos = new QLabel("当前单元格:", this); LabCellPos->setMinimumWidth(180); LabCellPos->setAlignment(Qt::AlignHCenter); LabCellText = new QLabel("单元格内容:", this); ui->statusbar->addWidget(LabCurFile); ui->statusbar->addWidget(LabCellPos); ui->statusbar->addWidget(LabCellText); // 连接信号和槽 connect(ui->tableView->selectionModel(), &QItemSelectionModel::currentChanged, this, &MainWindow::on_currentChanged); // 初始化文本内容 updateTextEdit(); } MainWindow::~MainWindow() { delete ui; db.close(); } void MainWindow::loadDatabase() { db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("D:/QT_PROGRAM/play32/lyshark-1.db"); if (!db.open()) { QMessageBox::critical(this, "错误", "无法打开数据库"); return; } // 初始化表结构 QSqlQuery query; query.exec("CREATE TABLE IF NOT EXISTS book (" "num INTEGER PRIMARY KEY AUTOINCREMENT, " "id VARCHAR(40) NOT NULL, " "title VARCHAR(40) NOT NULL, " "author VARCHAR(40) NOT NULL," "price VARCHAR(40) NOT NULL," "publisher VARCHAR(40) NOT NULL)" ); sqlModel = new QSqlTableModel(this); sqlModel->setTable("book"); sqlModel->setEditStrategy(QSqlTableModel::OnFieldChange); sqlModel->select(); // 插入示例数据(如果表为空) if (sqlModel->rowCount() == 0) { QSqlQuery insertQuery; insertQuery.exec("INSERT INTO book (id, title, author, price, publisher) VALUES " "('lyshark.cnblogs.com', 'm', '25', '1234567890', 'beijing'), " "('www.lyshark.com', 'x', '22', '4567890987', 'shanghai')"); } } void MainWindow::on_actionOpen_triggered() { QString curPath = QCoreApplication::applicationDirPath(); QString fileName = QFileDialog::getOpenFileName(this, "打开文件", curPath, "文本文件 (*.txt);;所有文件 (*.*)"); if (fileName.isEmpty()) { return; } QFile file(fileName); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { QMessageBox::warning(this, "错误", "无法打开文件"); return; } QTextStream in(&file); textEdit->setPlainText(in.readAll()); file.close(); LabCurFile->setText("当前文件:" + fileName); } void MainWindow::on_actionSave_triggered() { QString curPath = QCoreApplication::applicationDirPath(); QString fileName = QFileDialog::getSaveFileName(this, "保存文件", curPath, "文本文件 (*.txt);;所有文件 (*.*)"); if (fileName.isEmpty()) { return; } QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, "错误", "无法保存文件"); return; } QTextStream out(&file); out << textEdit->toPlainText(); file.close(); LabCurFile->setText("当前文件:" + fileName); } void MainWindow::on_actionAppend_triggered() { sqlModel->insertRow(sqlModel->rowCount()); } void MainWindow::on_actionInsert_triggered() { QModelIndex currentIndex = ui->tableView->selectionModel()->currentIndex(); if (!currentIndex.isValid()) { return; } sqlModel->insertRow(currentIndex.row()); } void MainWindow::on_actionDelete_triggered() { QModelIndex currentIndex = ui->tableView->selectionModel()->currentIndex(); if (!currentIndex.isValid()) { return; } sqlModel->removeRow(currentIndex.row()); sqlModel->submitAll(); } void MainWindow::on_actionPreview_triggered() { updateTextEdit(); } void MainWindow::on_currentChanged(const QModelIndex ¤t, const QModelIndex &previous) { Q_UNUSED(previous); if (current.isValid()) { LabCellPos->setText(QString("当前单元格:%1行,%2列").arg(current.row()).arg(current.column())); LabCellText->setText("单元格内容:" + sqlModel->data(current).toString()); } } void MainWindow::on_pushButton_center_clicked() { textEdit->setAlignment(Qt::AlignCenter); } void MainWindow::on_pushButton_left_clicked() { textEdit->setAlignment(Qt::AlignLeft); } void MainWindow::on_pushButton_right_clicked() { textEdit->setAlignment(Qt::AlignRight); } void MainWindow::on_pushButton_bold_clicked() { QFont font = textEdit->currentFont(); font.setBold(!font.bold()); textEdit->setCurrentFont(font); } void MainWindow::updateTextEdit() { textEdit->clear(); for (int i = 0; i < sqlModel->rowCount(); ++i) { QString rowText; for (int j = 0; j < sqlModel->columnCount(); ++j) { rowText += sqlModel->data(sqlModel->index(i, j)).toString() + "\t"; } textEdit->append(rowText.trimmed()); } } void MainWindow::on_actionExit_triggered() { QApplication::quit(); }

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <rect> <x>0</x> <y>0</y> <width>1200</width> <height>800</height> </rect> <string>手机销售管理系统</string> <widget class="QWidget" name="centralwidget"> <layout class="QVBoxLayout" name="verticalLayout" stretch="0,1"> <item> <widget class="QTabWidget" name="tabWidget"> <number>0</number> <widget class="QWidget" name="tab_PhoneManage"> <layout class="QVBoxLayout" name="layout_PhoneMain"> <layout class="QGridLayout" name="grid_PhoneInput" spacing="10"> <item row="0" column="0"> <widget class="QLabel" name="label_PhoneID"> <string>手机编号:</string> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="txtPhoneID"> <string>必填,20位以内</string> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="label_Model"> <string>手机型号:</string> </widget> </item> <item row="0" column="3"> <widget class="QLineEdit" name="txtModel"/> </item> <item row="1" column="0"> <widget class="QLabel" name="label_Brand"> <string>手机品牌:</string> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="txtBrand"/> </item> <item row="1" column="2"> <widget class="QLabel" name="label_PPrice"> <string>进价(元):</string> </widget> </item> <item row="1" column="3"> <widget class="QDoubleSpinBox" name="txtPPrice"> <double>0.00</double> <number>2</number> </widget> </item> <item row="2" column="0"> <widget class="QLabel" name="label_Stock"> <string>库存数量:</string> </widget> </item> <item row="2" column="1"> <widget class="QSpinBox" name="txtStock"> <number>0</number> </widget> </item> </layout> <layout class="QHBoxLayout" name="layout_PhoneBtns" spacing="20"> <item> <widget class="QPushButton" name="btnAddPhone"> <string>添加手机</string> <size> <width>20</width> <height>20</height> </size> </widget> </item> <item> <widget class="QPushButton" name="btnModifyPhone"> <string>修改信息</string> </widget> </item> <item> <widget class="QPushButton" name="btnDeletePhone"> <string>删除手机</string> </widget> </item> <item> <widget class="QPushButton" name="btnRefreshPhone"> <string>刷新列表</string> </widget> </item> </layout> <widget class="QTableWidget" name="tablePhoneList"> <number>5</number> <number>0</number> <column> <string>编号</string> </column> <column> <string>型号</string> </column> <column> <string>品牌</string> </column> <column> <string>进价(元)</string> </column> <column> <string>库存</string> </column> <bool>true</bool> </widget> </layout> <string>手机管理</string> </widget> <widget class="QWidget" name="tab_SaleManage"> <layout class="QVBoxLayout" name="layout_SaleMain"> <layout class="QGridLayout" name="grid_SaleInput" spacing="10"> <item row="0" column="0"> <widget class="QLabel" name="label_SaleID"> <string>手机编号:</string> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="txtSaleID"> <string>需与手机编号一致</string> </widget> </item> <item row="0" column="2"> <widget class="QLabel" name="label_SPrice"> <string>销售单价:</string> </widget> </item> <item row="0" column="3"> <widget class="QDoubleSpinBox" name="txtSPrice"> <double>0.00</double> <number>2</number> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_SaleNum"> <string>销售数量:</string> </widget> </item> <item row="1" column="1"> <widget class="QSpinBox" name="txtSaleNum"> <number>1</number> </widget> </item> <item row="1" column="2"> <widget class="QLabel" name="label_SaleDate"> <string>销售日期:</string> </widget> </item> <item row="1" column="3"> <widget class="QDateEdit" name="dateSale"> <string>yyyy-MM-dd</string> <bool>true</bool> <date> <year>2024</year> <month>1</month> <day>1</day> </date> </widget> </item> </layout> <layout class="QHBoxLayout" name="layout_SaleBtns" spacing="20"> <item> <widget class="QPushButton" name="btnAddSale"> <string>添加销售记录</string> </widget> </item> <item> <widget class="QPushButton" name="btnRefreshSale"> <string>刷新销售记录</string> </widget> </item> </layout> <widget class="QTableWidget" name="tableSaleList"> <number>6</number> <number>0</number> <column> <string>编号</string> </column> <column> <string>型号</string> </column> <column> <string>品牌</string> </column> <column> <string>单价(元)</string> </column> <column> <string>数量</string> </column> <column> <string>销售日期</string> </column> <bool>true</bool> </widget> </layout> <string>销售管理</string> </widget> <widget class="QWidget" name="tab_Statistics"> <layout class="QVBoxLayout" name="layout_StatMain" spacing="15"> <layout class="QGridLayout" name="grid_StatInput" spacing="10"> <item row="0" column="0"> <widget class="QLabel" name="label_SearchID"> <string>按编号查询:</string> </widget> </item> <item row="0" column="1"> <widget class="QLineEdit" name="txtSearchID"/> </item> <item row="0" column="2"> <widget class="QPushButton" name="btnSearchID"> <string>查询</string> </widget> </item> <item row="1" column="0"> <widget class="QLabel" name="label_StatBrand"> <string>按品牌统计:</string> </widget> </item> <item row="1" column="1"> <widget class="QLineEdit" name="txtStatBrand"/> </item> <item row="1" column="2"> <widget class="QPushButton" name="btnStatBrand"> <string>统计</string> </widget> </item> </layout> <widget class="QTextBrowser" name="txtStatResult"> <size> <width>0</width> <height>200</height> </size> <string>查询/统计结果将显示在此...</string> </widget> </layout> <string>查询统计</string> </widget> <widget class="QWidget" name="tab_Sort"> <layout class="QVBoxLayout" name="layout_SortMain"> <layout class="QHBoxLayout" name="layout_SortBtns" spacing="30"> <item> <widget class="QPushButton" name="btnSortPrice"> <string>按进价排序(升序)</string> <size> <width>150</width> <height>40</height> </size> </widget> </item> <item> <widget class="QPushButton" name="btnSortDate"> <string>按销售日期排序(最近优先)</string> <size> <width>150</width> <height>40</height> </size> </widget> </item> </layout> <widget class="QLabel" name="label_SortTip"> <string>注:排序后自动刷新对应表格数据</string> <string>color: #666; font-size: 12px;</string> </widget> </layout> <string>排序管理</string> </widget> </widget> </item> </layout> </widget> <widget class="QMenuBar" name="menubar"> <rect> <x>0</x> <y>0</y> <width>1200</width> <height>26</height> </rect> <widget class="QMenu" name="menuFile"> <string>文件</string> <addaction name="actionSave"/> <addaction name="actionLoad"/> </widget> <addaction name="menuFile"/> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <action name="actionSave"> <string>保存数据</string> </action> <action name="actionLoad"> <string>加载数据</string> </action> <resources/> <connections/> </ui> 该ui文件读取第28行72列时出错,请改正并给出修改后的ui文件

FormSettings_Basic::FormSettings_Basic(QWidget *parent) : QWidget(parent), ui(new Ui::FormSettings_Basic) { qDebug()<<"FormSettings_Basic(QWidget *parent) start"; ui->setupUi(this); this->setWindowState(Qt::WindowFullScreen); // 设置quickWidget透明 ui->quickWidget->setAttribute(Qt::WA_AlwaysStackOnTop); ui->quickWidget->setClearColor(QColor(Qt::transparent)); ui->pushButton_beltset->setGeometry(100,50,600,300); ui->pushButton_GZM->setGeometry(950,50,600,300); ui->pushButton_CGQ->setGeometry(100,500,600,300); ui->pushButton_BHXX->setGeometry(950,500,580,295); QLabel *lb = ui->label_Title; lb->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); lb->adjustSize(); lb->move((this->width()-lb->width())/2,10); ui->quickWidget->rootContext()->setContextProperty("testData", this); ui->quickWidget->setSource(QUrl(QStringLiteral("qrc:/animator.qml"))); // 更新为Qt6风格的信号槽连接 //connect(ui->pushButton_beltset, &QPushButton::clicked, this, &FormSettings_Basic::BeltSetClicked); //connect(ui->pushButton_beltset, &QPushButton::clicked, beltset, &Form_BeltSetting::BeltSeting_show); qDebug()<<"FormSettings_Basic(QWidget *parent) end"; } // 其他成员函数保持不变... // 事件过滤器更新 bool FormSettings_Basic::eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::KeyPress) { QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event); // 处理键盘事件... } return QWidget::eventFilter(object, event); } void FormSettings_Basic::on_pushButton_beltset_clicked() { emit BeltSetClicked();//函数直接发送信号 } void FormSettings_Basic::on_pushButton_BHXX_clicked() { emit protection_show(); } void FormSettings_Basic::on_pushButton_GZM_clicked() { emit GZMTZ_show(); } 编译报错:-1: error: moc_formsettings_basic.o:(.data.rel.ro._ZTV18FormSettings_Basic[_ZTV18FormSettings_Basic]+0x28): undefined reference to FormSettings_Basic::~FormSettings_Basic()'

<?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>MainWindow</class> <widget class="QMainWindow" name="MainWindow"> <rect> <x>0</x> <y>0</y> <width>803</width> <height>600</height> </rect> <string>天气情况分析</string> <widget class="QWidget" name="centralwidget"> <widget class="QTabWidget" name="tabWidget"> <rect> <x>0</x> <y>0</y> <width>801</width> <height>551</height> </rect> <string notr="true">background-color: qlineargradient(spread:pad, x1:0.484346, y1:1, x2:0.479, y2:0, stop:0 rgba(158, 214, 255, 255), stop:1 rgba(255, 255, 255, 255));</string> <number>0</number> <widget class="QWidget" name="tab"> <attribute name="title"> <string>数据预处理</string> </attribute> <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QGroupBox" name="groupBox"> <string>选择与清洗</string> <layout class="QVBoxLayout" name="verticalLayout"> <item> <widget class="QPushButton" name="pushButton"> <string>选择csv文件</string> </widget> </item> <item> <widget class="QComboBox" name="comboBox"> <item> <string>数值型列:使用KNNImputer填充缺失值</string> </item> <item> <string>非数值型列:使用该列的众数填充空值</string> </item> <item> <string>基于全部列删除重复项:使用drop_duplicates()方法删除所有重复的行</string> </item> <item> <string>异常值处理:使用IQR(四分位距)方法移除数据集数值型列中的异常值</string> </item> <item> <string>数据格式化和类型转换:对数值型列进行Min-Max归一化</string> </item> <item> <string>数据排序:根据索引排序</string> </item> <item> <string>数据存储:使用to_csv()方法将清洗后的数据存储到一个cleaned.csv文件中</string> </item> </widget> </item> </layout> </widget> </item> <item> <widget class="QTableView" name="tableView"/> </item> </layout> </widget> <widget class="QWidget" name="tab_2"> <attribute name="title"> <string>可视化</string> </attribute> <layout class="QHBoxLayout" name="horizontalLayout"> <item> <widget class="QGroupBox" name="groupBox_2"> <string>可视化选项</string> <layout class="QVBoxLayout" name="verticalLayout_2"> <item> <widget class="QPushButton" name="pushButton_2"> <string>温度、气压、湿度随时间变化的折线图</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_3"> <string>不同站点PM2.5的柱状图</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_4"> <string>累积降水量·的面积图</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_5"> <string>各站点颗粒物浓度的散点图</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_6"> <string>气象玫瑰图</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_7"> <string>气象和污染物指标的雷达图</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_8"> <string>箱线图展示数据分布</string> </widget> </item> </layout> </widget> </item> <item> <widget class="QGraphicsView" name="graphicsView"/> </item> </layout> </widget> <widget class="QWidget" name="tab_3"> <attribute name="title"> <string>算法建模</string> </attribute> <layout class="QHBoxLayout" name="horizontalLayout_2"> <item> <widget class="QGroupBox" name="groupBox_3"> <string>算法选项</string> <layout class="QVBoxLayout" name="verticalLayout_4"> <item> <widget class="QPushButton" name="pushButton_9"> <string>线性回归</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_10"> <string>移动平均</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_11"> <string>时间序列分解</string> </widget> </item> <item> <widget class="QPushButton" name="pushButton_12"> <string>经典时间序列预测模型</string> </widget> </item> </layout> </widget> </item> <item> <widget class="QGraphicsView" name="graphicsView_2"/> </item> </layout> </widget> </widget> </widget> <widget class="QMenuBar" name="menubar"> <rect> <x>0</x> <y>0</y> <width>803</width> <height>33</height> </rect> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> <connections/> </ui> 如果我要用网页实现上述ui文件的功能,怎么写python代码,已知要处理的cav文件有五万多行数据

#include "AutoCuttingWidget.h" #include "AutoCuttingAlarmTable.h" #include "Component/LightLabel/lightLabel.h" #include "Component/QFlightInstruments/LayoutSquare.hpp" #include "Component/LineRuler/LineRuler.h" #include "Component/LineRuler/RulerWidget.h" #include "AutoCuttingActionDBManager.h" #include "CircuitBaseScene.h" #include "GraphicElementManage.h" #include <QDebug> #include <SystemSetting.h> AutoCuttingWidget::AutoCuttingWidget(QWidget* parent) : QWidget(parent) , ui(new Ui::AutoCuttingWidgetClass()) { ui->setupUi(this); initLineRuler(); initAmpHistoryLineCharts(); initAlarmMessageTable(); initRemotePanel(); initPFDParameter(); initRemoteConnectParam(); initCutMonitor(); initDrawCutPathViewer(); m_autoCutXmlFilePath = QCoreApplication::applicationDirPath() + "/autoCutXML/"; } AutoCuttingWidget::~AutoCuttingWidget() { if (m_updateCutMonitorTimer) { m_updateCutMonitorTimer->stop(); //delete m_updateCutMonitorTimer; m_updateCutMonitorTimer = nullptr; } delete ui; } void AutoCuttingWidget::on_pushButton_drawPath_clicked() { ui->stackedWidget_autocut->setCurrentWidget(ui->page_cutPath); m_curView->enbaleDrawLine(true); } void AutoCuttingWidget::on_pushButton_clearCutPath_clicked() { QList<QGraphicsItem*> itemList = m_curView->items(); for (QGraphicsItem* item : itemList) { m_curView->scene()->removeItem(item); } } void AutoCuttingWidget::on_pushButton_startAuto_clicked() { m_updateCutMonitorTimer->stop(); resetAutoCuttingDataList(); m_updateCutMonitorTimer->start(hxcommon::SystemSetting::autoCutRefreshInterval); ui->stackedWidget_autocut->setCurrentWidget(ui->page_cutMonitor); } void AutoCuttingWidget::on_pushButton_stopAuto_clicked() { m_updateCutMonitorTimer->stop(); } void AutoCuttingWidget::on_pushButton_systemVoltage_clicked() { qDebug() << "on_pushButton_systemVoltage_clicked"; ui->stackedWidget->setCurrentIndex(0); } void AutoCuttingWidget::on_pushButton_pumpCurrent_clicked() { qDebug() << "on_pushButton_pumpCurrent_clicked"; ui->stackedWidget->setCurrentIndex(1); } void AutoCuttingWidget::on_pushButton_cutLowCurrent_clicked() { qDebug() << "on_pushButton_cutLowCurrent_clicked"; ui->stackedWidget->setCurrentIndex(2); } void AutoCuttingWidget::on_pushButton_cutHighCurrent_clicked() { qDebug() << "on_pushButton_cutHighCurrent_clicked"; ui->stackedWidget->setCurrentIndex(3); } void AutoCuttingWidget::on_pushButton_memoryStart_clicked() { QDateTime time = QDateTime::currentDateTime(); QString dateTime = time.toString("MM-dd-hh-mm"); QString pathname = m_autoCutXmlFilePath + QStringLiteral("自动截割路径_%1.xml").arg(dateTime); m_autoCutFileSavePath = QFileDialog::getSaveFileName(this, QStringLiteral("保存自动截割路径"), pathname, "Xml(*.xml)"); } void AutoCuttingWidget::on_pushButton_memoryStop_clicked() { QString savePath = m_autoCutFileSavePath; if (savePath.isEmpty()) { QDateTime time = QDateTime::currentDateTime(); QString dateTime = time.toString("MM-dd-hh-mm"); savePath = m_autoCutXmlFilePath + QStringLiteral("自动截割路径_%1.xml").arg(dateTime); } if (m_graphicElementManager.saveCurrentPage(savePath)) { emit showResponseMessage(hxcommon::NotifyType::Notify_Type_Success,QStringLiteral("自动截割路径保存成功!")); } else { emit showResponseMessage(hxcommon::NotifyType::Notify_Type_Error, QStringLiteral("保存失败!")); } } void AutoCuttingWidget::on_pushButton_memoryModel_clicked() { QString fileName = QFileDialog::getOpenFileName(this, QStringLiteral("请打开自动截割路径文件"), m_autoCutFileSavePath, "Xml(*.xml)"); QFile file(fileName); if (!file.open(QIODevice::ReadOnly)) { qDebug() << "Open failed"; return; } m_graphicElementManager.openPage(file); } void AutoCuttingWidget::initAlarmMessageTable() { m_alarmMessageTable = new AutoCuttingAlarmTable(ui->widget_abnormalInfo); QLayout* alarmMessageTableLayout = ui->widget_abnormalInfo->layout(); if (alarmMessageTableLayout) { // 如果 layout 是 QVBoxLayout 类型,添加控件 QVBoxLayout* vboxLayout = qobject_cast<QVBoxLayout*>(alarmMessageTableLayout); if (vboxLayout) { vboxLayout->addWidget(m_alarmMessageTable); } } } void AutoCuttingWidget::initRemotePanel() { // 创建 4x4 的网格布局 m_remotePanelLayout = new QGridLayout(ui->widget_remotePanel); ui->widget_remotePanel->setLayout(m_remotePanelLayout); // 定义 4x4 的内容 QStringList labels = { QStringLiteral("截割头伸"), QStringLiteral("铲板升"), QStringLiteral("一运正转"), QStringLiteral("左后退"), QStringLiteral("截割头缩"), QStringLiteral("铲板降"), QStringLiteral("一运反转"), QStringLiteral("右后退"), QStringLiteral("左前进"), QStringLiteral("后支撑升"), QStringLiteral("截割左"), QStringLiteral("星轮正转"), QStringLiteral("右前进"), QStringLiteral("后支撑降"), QStringLiteral("截割右"), QStringLiteral("星轮反转") }; // 创建并添加 lightLabel 到布局 int index = 0; for (int row = 0; row < 4; ++row) { for (int col = 0; col < 4; ++col) { lightLabel* label = new lightLabel(ui->widget_remotePanel); label->setLabelText(labels[index++]); // 设置内容 label->setLightPointStep(0); m_remotePanelLayout->addWidget(label, row, col); // 添加到网格布局 } } } void AutoCuttingWidget::initPFDParameter() { LayoutSquare* m_layoutSq = new LayoutSquare(this); m_layoutSq->setContentsMargins(0, 0, 0, 0); m_layoutSq->addWidget(ui->framePFD); } void AutoCuttingWidget::initRemoteConnectParam() { //m_remoteConnectLayout = new QGridLayout(ui->widget_remoteConnectInfo); //ui->widget_remoteConnectInfo->setLayout(m_remoteConnectLayout); //QStringList labels = { // QStringLiteral("遥控在线"), QStringLiteral("油泵启动"), QStringLiteral("截割启动"), QStringLiteral("一运启动"), // QStringLiteral("二运启动"), QStringLiteral("皮带启动"), QStringLiteral("星轮启动"), QStringLiteral("人员误入") //}; //int index = 0; //for (int row = 0; row < 2; ++row) { // for (int col = 0; col < 4; ++col) { // lightLabel* label = new lightLabel(ui->widget_remoteConnectInfo); // label->setLabelText(labels[index++]); // 设置内容 // label->setLightPointStep(0); // m_remoteConnectLayout->addWidget(label, row, col); // 添加到网格布局 // } //} // 创建 4x4 的网格布局 //m_remoteConnectLayout = new QGridLayout(ui->widget_remoteConnectInfo); //ui->widget_remoteConnectInfo->setLayout(m_remoteConnectLayout); //// 定义 4x4 的内容 //QStringList labels = { // QStringLiteral("截割头伸"), QStringLiteral("铲板升"), QStringLiteral("一运正转"), QStringLiteral("左后退"), // QStringLiteral("截割头缩"), QStringLiteral("铲板降"), QStringLiteral("一运反转"), QStringLiteral("右后退"), // QStringLiteral("左前进"), QStringLiteral("后支撑升"), QStringLiteral("截割左"), QStringLiteral("星轮正转"), // QStringLiteral("右前进"), QStringLiteral("后支撑降"), QStringLiteral("截割右"), QStringLiteral("星轮反转") //}; //// 创建并添加 lightLabel 到布局 //int index = 0; //for (int row = 0; row < 4; ++row) { // for (int col = 0; col < 4; ++col) { // lightLabel* label = new lightLabel(ui->widget_remoteConnectInfo); // label->setLabelText(labels[index++]); // 设置内容 // label->setLightPointStep(0); // m_remoteConnectLayout->addWidget(label, row, col); // 添加到网格布局 // } //} } void AutoCuttingWidget::initLineRuler() { // 创建 RulerWidget 实例,方向为垂直 RulerWidget* verticalRuler = new RulerWidget(Qt::Vertical, this); // 检查 widget_verticalRuler 是否已有布局 QLayout* verticallayout = ui->widget_verticalRuler->layout(); if (!verticallayout) { // 如果没有布局,创建一个 QVBoxLayout verticallayout = new QVBoxLayout(ui->widget_verticalRuler); ui->widget_verticalRuler->setLayout(verticallayout); } // 设置布局的间隔和边距为 0 verticallayout->setSpacing(0); verticallayout->setContentsMargins(0, 0, 0, 0); // 将 RulerWidget 添加到布局中 verticallayout->addWidget(verticalRuler); // 创建 RulerWidget 实例,方向为垂直 RulerWidget* horizontalRuler = new RulerWidget(Qt::Horizontal, this); // 检查 widget_verticalRuler 是否已有布局 QLayout* horizontalLayout = ui->widget_horizontalRuler->layout(); if (!horizontalLayout) { // 如果没有布局,创建一个 QVBoxLayout horizontalLayout = new QVBoxLayout(ui->widget_horizontalRuler); ui->widget_verticalRuler->setLayout(horizontalLayout); } // 设置布局的间隔和边距为 0 horizontalLayout->setSpacing(0); horizontalLayout->setContentsMargins(0, 0, 0, 0); // 将 RulerWidget 添加到布局中 horizontalLayout->addWidget(horizontalRuler); } void AutoCuttingWidget::initAmpHistoryLineCharts() { m_lineChartSystemVoltage = new AmpHistoryLineChart(ui->page_systemVoltage); m_lineChartPumpAmp = new AmpHistoryLineChart(ui->page_pumpCurrent); m_lineChartLowCutAmp = new AmpHistoryLineChart(ui->page_cutLowCurrent); m_lineChartHighCutAmp = new AmpHistoryLineChart(ui->page_cutHighCurrent); // 获取 ui 中的布局,并确保布局充满空间 QLayout* layoutSystemVoltage = ui->page_systemVoltage->layout(); if (layoutSystemVoltage) { // 如果 layout 是 QVBoxLayout 类型,添加控件 QVBoxLayout* vboxLayoutSystemVoltage = qobject_cast<QVBoxLayout*>(layoutSystemVoltage); if (vboxLayoutSystemVoltage) { vboxLayoutSystemVoltage->addWidget(m_lineChartSystemVoltage); } } QLayout* layoutPump = ui->page_pumpCurrent->layout(); if (layoutPump) { QVBoxLayout* vboxLayoutPump = qobject_cast<QVBoxLayout*>(layoutPump); if (vboxLayoutPump) { vboxLayoutPump->addWidget(m_lineChartPumpAmp); } } QLayout* layoutLowCut = ui->page_cutLowCurrent->layout(); if (layoutLowCut) { QVBoxLayout* vboxLayoutLowCut = qobject_cast<QVBoxLayout*>(layoutLowCut); if (vboxLayoutLowCut) { vboxLayoutLowCut->addWidget(m_lineChartLowCutAmp); } } QLayout* layoutHighCut = ui->page_cutHighCurrent->layout(); if (layoutHighCut) { QVBoxLayout* vboxLayoutHighCut = qobject_cast<QVBoxLayout*>(layoutHighCut); if (vboxLayoutHighCut) { vboxLayoutHighCut->addWidget(m_lineChartHighCutAmp); } } m_lineChartPumpAmp->setYAxisRange(0, 100); m_lineChartLowCutAmp->setYAxisRange(0, 100); m_lineChartHighCutAmp->setYAxisRange(0, 100); // TODO:假设数据点,替换为实时数据 QList<QPointF> list; QDateTime currentTime = QDateTime::currentDateTime(); for (int i = 0; i < 120; ++i) { // 120个数据点,代表最近两个小时 list.append(QPointF(currentTime.addSecs(-i * 60).toMSecsSinceEpoch(), QRandomGenerator::global()->bounded(10, 14))); } m_lineChartPumpAmp->setLineData(list); m_lineChartLowCutAmp->setLineData(list); m_lineChartHighCutAmp->setLineData(list); } void AutoCuttingWidget::initCutMonitor() { m_autoCuttingProcessor = new AutoCuttingProcessor(this); hxDataBaseManager::AutoCuttingActionDBManager dbManager; QList<hxcommon::AutoCuttingAction*> list = dbManager.getActionList(); m_autoCuttingProcessor->setActionList(list); m_autoCuttingProcessor->doWork(); m_updateCutMonitorTimer = new QTimer(); connect(m_updateCutMonitorTimer, &QTimer::timeout, this, &AutoCuttingWidget::testDrawCutterMonitor); m_cutter = new QGraphicsPixmapItem(QPixmap(":/mainwindow/Resource/AutoCutting/cutter.png").scaled(60, 60, Qt::KeepAspectRatio)); } void AutoCuttingWidget::resetAutoCuttingDataList() { if (m_updateCutMonitorTimer) { m_updateCutMonitorTimer->stop();//先停止可能正在进行的 } // 重置GraphicsScene int width = ui->widget_cutterMonitorPainter->width(); int height = ui->widget_cutterMonitorPainter->height(); int rowPointCount = hxcommon::SystemSetting::autoCutRowTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一行多少点 int columnPointCount = hxcommon::SystemSetting::autoCutColumnTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一列多少点 int columnSplitPointCount = columnPointCount / hxcommon::SystemSetting::autoCutColumnSplit;//向上的每段多少点 double wItem = 540.0 / rowPointCount;//SceneRect尺寸600 - 截割头60 double hItem = 360.0 / columnPointCount;//SceneRect尺寸420 - 截割头60 ui->graphicsViewCutterMonitor->setGeometry(width / 2 - 310, height / 2 - 220, 620, 440);//居中,因为带20边框 QGraphicsScene* scene = ui->graphicsViewCutterMonitor->scene(); if (!scene) { scene = new QGraphicsScene(this); ui->graphicsViewCutterMonitor->setScene(scene); } scene->setSceneRect(0, 0, 600, 420); // 禁用滚动条 ui->graphicsViewCutterMonitor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsViewCutterMonitor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 禁用鼠标拖拽滚动 ui->graphicsViewCutterMonitor->setDragMode(QGraphicsView::NoDrag); // 禁用鼠标滚轮滚动 ui->graphicsViewCutterMonitor->setTransformationAnchor(QGraphicsView::NoAnchor); // 禁用索引提高性能 scene->setItemIndexMethod(QGraphicsScene::NoIndex); //清空画布 scene->clear(); //清空指令列表 m_autoCuttingDataList.clear(); //不管分多少段,最底下从左到右都是一样的 for (int x = 0; x < rowPointCount; x++) { int y = QRandomGenerator::global()->bounded(columnPointCount - 2, columnPointCount); //int y = columnPointCount - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed); m_autoCuttingDataList.append(point);//从左到右 } for (int i = 0; i < hxcommon::SystemSetting::autoCutColumnSplit; i++) { if (i % 2 == 0) { //顺着右侧向上 int yStart = columnPointCount - columnSplitPointCount * i - 1; int yEnd = columnPointCount - columnSplitPointCount * (i + 1); for (int y = yStart; y >= yEnd; y--) { int x = QRandomGenerator::global()->bounded(rowPointCount - 2, rowPointCount); //int x = rowPointCount - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed, 128); m_autoCuttingDataList.append(point);//右边向上 } for (int x = rowPointCount - 1; x >= 0; x--) { int y = QRandomGenerator::global()->bounded(yEnd - 2, yEnd); //int y = yEnd - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 + hxcommon::SystemSetting::autoCutHorizontalSpeed); m_autoCuttingDataList.append(point);//从右到左 } } else { //顺着左侧向上 int yStart = columnPointCount - columnSplitPointCount * i - 1; int yEnd = columnPointCount - columnSplitPointCount * (i + 1); for (int y = yStart; y >= yEnd; y--) { int x = QRandomGenerator::global()->bounded(-1, 1); //int x = 0; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed, 128); m_autoCuttingDataList.append(point);//左边向上 } for (int x = 0; x < rowPointCount; x++) { int y = QRandomGenerator::global()->bounded(yEnd - 2, yEnd); //int y = yEnd - 1; AutoCuttingPoint point(x, y, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128 - hxcommon::SystemSetting::autoCutHorizontalSpeed); m_autoCuttingDataList.append(point);//从左到右 } } } //结束时添加停止命令 if (hxcommon::SystemSetting::autoCutColumnSplit % 2 == 0) { AutoCuttingPoint point1(rowPointCount - 1, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point1); AutoCuttingPoint point2(rowPointCount - 1, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point2); } else { AutoCuttingPoint point1(0, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point1); AutoCuttingPoint point2(0, 0, hxcommon::HeadingCutterCmdEnum::JoystickArm, 128, 128); m_autoCuttingDataList.append(point2); } } void AutoCuttingWidget::initDrawCutPathViewer() { // 创建管理器 hxdraw2dlib::GraphicElementManage manager; // 创建场景 hxdraw2dlib::CircuitBaseScene* pScene = new hxdraw2dlib::CircuitBaseScene(this); //pScene->setSceneRect(-297 * 3 / 2, -210 * 3 / 2, 297 * 3, 210 * 3); pScene->setScalePerGrid(10.0); QTimer::singleShot(0, this, [=]() { QSize widgetSize = ui->widget_drawCutPathView->size(); pScene->setSceneRect(0, 0, widgetSize.width(), widgetSize.height()); }); // 创建视图(不要设置 parent) hxdraw2dlib::CircuitBaseView* view = new hxdraw2dlib::CircuitBaseView(pScene); m_curView = view; view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); // 获取或创建布局 QLayout* layout = ui->widget_drawCutPathView->layout(); if (layout) { // 如果 layout 是 QVBoxLayout 类型,添加控件 QVBoxLayout* vboxLayout = qobject_cast<QVBoxLayout*>(layout); vboxLayout->setContentsMargins(0, 0, 0, 0); // 去除边距 vboxLayout->setSpacing(0); // 去除间隔 if (vboxLayout) { //QTimer::singleShot(0, this, [=]() { //vboxLayout->addWidget(m_curView); //}); } } m_graphicElementManager.setCurView(m_curView); } void AutoCuttingWidget::testDrawCutterMonitor() { //获取本次要绘制的点 if (m_autoCuttingDataList.size() == 0) { return; } AutoCuttingPoint point = m_autoCuttingDataList.takeFirst(); emit sendAutoCuttingCmd(point.cmd, point.b0, point.b1); m_cutterRotation -= 13; if (m_cutterRotation <= -360) { m_cutterRotation = 0; } int width = ui->widget_cutterMonitorPainter->width(); int height = ui->widget_cutterMonitorPainter->height(); int rowPointCount = hxcommon::SystemSetting::autoCutRowTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一行多少点 int columnPointCount = hxcommon::SystemSetting::autoCutColumnTakeTime / hxcommon::SystemSetting::autoCutRefreshInterval;//一列多少点 double wItem = 540.0 / rowPointCount;//SceneRect尺寸600 - 截割头60 double hItem = 360.0 / columnPointCount;//SceneRect尺寸420 - 截割头60 //qDebug() << "width" << width << "height" << height; ui->graphicsViewCutterMonitor->setGeometry(width / 2 - 310, height / 2 - 220, 620, 440);//居中,因为带20边框 QGraphicsScene* scene = ui->graphicsViewCutterMonitor->scene(); if (!scene) { scene = new QGraphicsScene(this); ui->graphicsViewCutterMonitor->setScene(scene); } scene->setSceneRect(0, 0, 600, 420); // 禁用滚动条 ui->graphicsViewCutterMonitor->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); ui->graphicsViewCutterMonitor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // 禁用鼠标拖拽滚动 ui->graphicsViewCutterMonitor->setDragMode(QGraphicsView::NoDrag); // 禁用鼠标滚轮滚动 ui->graphicsViewCutterMonitor->setTransformationAnchor(QGraphicsView::NoAnchor); // 禁用索引提高性能 scene->setItemIndexMethod(QGraphicsScene::NoIndex); // 先移除画上去的截割头 scene->removeItem(m_cutter); //画很粗的圆组成切割图形 QGraphicsEllipseItem* circle = new QGraphicsEllipseItem(); circle->setRect(0, 0, 60, 60); // x, y, width, height (width=height时为圆形) circle->setPos(point.x * wItem, point.y * hItem); // 设置位置 circle->setBrush(QColor(26, 155, 114)); // 设置填充颜色 circle->setPen(QPen(QColor(26, 155, 114), 1)); // 设置边框 scene->addItem(circle);//添加到场景 //画小点连成轨迹 QGraphicsEllipseItem* linePoint = new QGraphicsEllipseItem(); linePoint->setRect(0, 0, 1, 1); // x, y, width, height (width=height时为圆形) linePoint->setPos(point.x * wItem + 30, point.y * hItem + 30); // 设置位置 linePoint->setBrush(Qt::green); // 设置填充颜色 linePoint->setPen(QPen(Qt::green, 1)); // 设置边框 scene->addItem(linePoint);//添加到场景 //画截割头和截割头旋转 scene->addItem(m_cutter); m_cutter->setPos(point.x * wItem, point.y * hItem); m_cutter->setTransformOriginPoint(QPointF(30, 30)); m_cutter->setRotation(m_cutterRotation); //联动左边姿态 float pitch = (columnPointCount / 2 - point.y) / columnPointCount * 80.0; float heading = (point.x - rowPointCount / 2) / rowPointCount * 80.0; ui->graphicsPFD->setPitch(pitch); ui->graphicsPFD->setHeading(heading); ui->graphicsPFD->update(); // ui->label_cutX->setText(QString::number(point.x)); ui->label_cutY->setText(QString::number(point.y)); }

智能电表项目全套资料#include "dianbiao2.h" #include "ui_dianbiao2.h" dianbiao2::dianbiao2(QWidget *parent) : QWidget(parent) , ui(new Ui::dianbiao2) { ui->setupUi(this); socket=new QTcpSocket(); socket->connectToHost("192.168.7.56",6666); this->setWindowTitle("电表实况"); fan=new fsmpFan(this); temp=new fsmpTempHum(this); // //beeper=new fsmpBeeper(); ele=new fsmpElectric(this); time=new QTimer(this); time1=new QTimer(this); time2=new QTimer(this); time3=new QTimer(this); connect(time1,&QTimer::timeout,this,&dianbiao2::time1Handler); connect(time2,&QTimer::timeout,this,&dianbiao2::time2Handler); connect(time3,&QTimer::timeout,this,&dianbiao2::time3Handler); setSocket(socket); } struct Info{ int type; float money; float dj; float current; float total; }; dianbiao2::~dianbiao2() { delete ui; } void dianbiao2::setSocket(QTcpSocket *s) { socket = s; connect(socket,&QTcpSocket::readyRead,this,&dianbiao2::recvData); } void dianbiao2::recvData() { QByteArray data=socket->readAll();//读取所有数据 ui->lcdNumber->display(QString(data)); } void dianbiao2::netConnected() { ui->label->setStyleSheet("background-color:green;border-radius:33px;"); //连接成功变绿 } void dianbiao2::netDisConnected() { ui->label->setStyleSheet("background-color:red;border-radius:33px;"); //断开连接变红 } void dianbiao2::enoughmoney() { float money=true; if(money>0){ ui->label_2->setStyleSheet("background-color:green;border-radius:33px;"); //钱够变绿 } } void dianbiao2::insuffmoney() { float money=true; if(money==0){ ui->label_2->setStyleSheet("background-color:red;border-radius:33px;"); //钱不够变红 } } void dianbiao2::temphum() { float temp=true; if(temp<50){ ui->label_3->setStyleSheet("background-color:green;border-radius:33px;"); //温度未超调 } } void dianbiao2::temphum2() { float temp=true; if(temp>50){ ui->label_3->setStyleSheet("background-color:red;border-radius:33px;"); //温度已超调 } } //风扇启动 void dianbiao2::fanstart() { float temp=true; if(temp){ fan->setSpeed(240); temp=false; fan->start(); } else{ temp=true; fan->stop(); } } void dianbiao2::checktemperature() { float temp =true; float threshold=30; if(temp>threshold) { fanstart(); ui->label_4->setStyleSheet("background-color:red;border-radius:33px;"); //温已未超调 } else{ fan->stop(); ui->label_4->setStyleSheet("background-color:green;border-radius:33px;"); //温度未超调 } } //电表实况三个连接 void dianbiao2::on_pushButton_clicked() { time1->start(1000); } void dianbiao2::on_lcdNumber_overflow() { } void dianbiao2::time1Handler() { /*struct Info in; in.type=5; ui->lcdNumber->display((const char *)&in);*/ struct Info in; in.type = 5; socket->write((const char *)&in); QByteArray data = socket->readAll(); ui->lcdNumber->display(QString(data)); } void dianbiao2::on_pushButton_2_clicked() { time2->start(1000); } void dianbiao2::on_lcdNumber_3_overflow() { } void dianbiao2::time2Handler() { // struct Info in; //in.type=5; //ui->lcdNumber_3->display(reinterpret_cast<const char *>(&in)); struct Info in; in.type = 5; socket->write((const char *)&in); QByteArray data = socket->readAll(); ui->lcdNumber_3->display(QString(data)); } void dianbiao2::on_pushButton_3_clicked() { time3->start(1000); } void dianbiao2::on_lcdNumber_2_overflow() { } void dianbiao2::time3Handler() { /*struct Info in; in.type=6; ui->lcdNumber_2->display(reinterpret_cast<const char *>(&in));*/ struct Info in; in.type = 6; socket->write((const char *)&in); QByteArray data = socket->readAll(); ui->lcdNumber_2->display(QString(data)); 请修改补充上述代码(完整版)帮我实现以下功能:用户端的三个lcd显示服务器返回的电价,电量,还能使用的剩余时间;以及如果连接成功label变色等功能

大家在看

recommend-type

libssl-1_1-x64.zip

如题,放到软件安装目录bin文件夹下即可。 在anaconda更新包时遇到了这个问题,找了了X64位可以用的,之后成功更新
recommend-type

IEC 61400-25风力发电标准-英文版

IEC61400风电国际标准,分为5个部分,内容包括总则、模型、通信协议、风机构成与控制等。
recommend-type

基于GFFT的LFSR序列生成多项式估计方法

针对线性反馈移位寄存器(LFSR)序列生成多项式的估计问题,提出了一种基于LFSR序列有限域傅里叶变换(GFFT)的估计方法。首先证明了LFSR序列GFFT的非零点与LFSR序列生成多项式的零点之间的对应关系,进而利用该性质实现 LFSR 序列生成多项式的快速估计,并给出了算法在误码环境下的改进方法。仿真实验验证了算法的有效性,并对算法的计算复杂度进行了理论分析。和已有算法相比较,本文提出的算法具有更高的计算效率。
recommend-type

IFIX 4.5 MB1 驱动

 MB1:有两个版本,6.x 和 7.x 版,通过串行口连接所有支持 Modbus 串行通讯协议的设备。主要有 Modicon PLC 和其它控制仪表如:Honeywell UDC,UMC,Moore 的控制仪表等。支持 Mobus RTU 和 ASCII 两种通讯协议。当使用其与其它兼容设备通讯时,注意数据类型会与 Modicon 的数据类型有所差别。7.x 版本支持电话拨号连接和无线电连接。
recommend-type

buliding\horse\pig\rabbit\table\wolf等各种点云数据集pcd文件

这里面包含了很多数据集,有buliding\horse\pig\rabbit\table\wolf等点云pcd文件,感兴趣的可以下载。

最新推荐

recommend-type

【Java使用配置文件连接mysql】

mysql使用druid配置连接mysql
recommend-type

Java课程设计画随机圆(1).pdf

Java课程设计画随机圆(1).pdf
recommend-type

获取本机IP地址的程序源码分析

从给定文件信息中我们可以提取出的关键知识点是“取本机IP”的实现方法以及与之相关的编程技术和源代码。在当今的信息技术领域中,获取本机IP地址是一项基本技能,广泛应用于网络通信类的软件开发中,下面将详细介绍这一知识点。 首先,获取本机IP地址通常需要依赖于编程语言和操作系统的API。不同的操作系统提供了不同的方法来获取IP地址。在Windows操作系统中,可以通过调用Windows API中的GetAdaptersInfo()或GetAdaptersAddresses()函数来获取网络适配器信息,进而得到IP地址。在类Unix操作系统中,可以通过读取/proc/net或是使用系统命令ifconfig、ip等来获取网络接口信息。 在程序设计过程中,获取本机IP地址的源程序通常会用到网络编程的知识,比如套接字编程(Socket Programming)。网络编程允许程序之间进行通信,套接字则是在网络通信过程中用于发送和接收数据的接口。在许多高级语言中,如Python、Java、C#等,都提供了内置的网络库和类来简化网络编程的工作。 在网络通信类中,IP地址是区分不同网络节点的重要标识,它是由IP协议规定的,用于在网络中唯一标识一个网络接口。IP地址可以是IPv4,也可以是较新的IPv6。IPv4地址由32位二进制数表示,通常分为四部分,每部分由8位构成,并以点分隔,如192.168.1.1。IPv6地址则由128位二进制数表示,其表示方法与IPv4有所不同,以冒号分隔的8组16进制数表示,如2001:0db8:85a3:0000:0000:8a2e:0370:7334。 当编写源代码以获取本机IP地址时,通常涉及到以下几个步骤: 1. 选择合适的编程语言和相关库。 2. 根据目标操作系统的API或系统命令获取网络接口信息。 3. 分析网络接口信息,提取出IP地址。 4. 将提取的IP地址转换成适合程序内部使用的格式。 5. 在程序中提供相应功能,如显示IP地址或用于网络通信。 例如,在Python中,可以使用内置的socket库来获取本机IP地址。一个简单的示例代码如下: ```python import socket # 获取主机名 hostname = socket.gethostname() # 获取本机IP local_ip = socket.gethostbyname(hostname) print("本机IP地址是:", local_ip) ``` 在实际应用中,获取本机IP地址通常是为了实现网络通信功能,例如建立客户端与服务器的连接,或者是在开发涉及到IP地址的其他功能时使用。 关于文件名称“getIP”,这是一个自解释的文件名,明显表示该文件或程序的作用是获取本机的IP地址。从标签“控件 源码 网络通信类 资源”中我们可以看出,这个文件很可能是一个可以嵌入其他软件中的代码片段,用以实现网络通信功能的一部分,具有较高的灵活性和重用性。 综上所述,获取本机IP地址是一个涉及到操作系统API、网络编程以及特定编程语言知识的技能。它不仅需要对编程语言提供的库函数有深入的理解,还要对操作系统的网络配置和IP协议有足够的认识。通过阅读和分析相关的源代码,如“getIP”,可以加深对网络编程实现细节的理解,并能够在实际开发中快速地应用这一技术。
recommend-type

【权威指南】:Win11笔记本上RTX4080驱动的安装与调试秘籍

# 1. Win11笔记本与RTX4080显卡介绍 随着技术的不断发展,笔记本电脑已不再是仅仅满足办公需求的移动设备,而是逐渐成为可以胜任复杂图形处理和游戏任务的强大工具。微软推出的Windows 11操作系统,以其全新的用户界面和改进的系统性能,为用户提供了更为流畅的操作体验。而在硬件方面,NVIDIA的RTX 4080显卡以其卓越的图形处理能力和AI支持,为笔记本电脑带来了前所未有的性能提升。本章节将带您初步了解Windows 11笔记本与NVIDIA RTX 4080显卡的基础信息,为进一步深入探讨它们的优化和调试技巧奠定基础。 ## 1.1 Win11笔记本的优势 Windows
recommend-type

windows环境举例

<think>好的,用户现在想在Windows环境下创建C函数库,需要具体的方法和示例代码。我需要结合之前的回答和用户提供的引用内容来给出合适的指导。 首先回顾之前的回答,用户已经了解了在Linux下创建静态库和动态库的方法,现在需要切换到Windows环境。根据引用[2],Windows下的C标准库和动态链接库的处理与Linux不同,比如使用dlfcn.h在Linux,而Windows可能需要其他方式。另外,引用[1]提到了在Windows下配置gcc环境(MinGW-w64),这可能是一个关键点,因为用户可能需要使用MinGW来编译库。 用户提供的引用[3]提到了使用MSVC编译器,这
recommend-type

QQ自动发送/回复系统源代码开放

根据提供的文件信息,我们可以了解到以下几点关键的知识点: ### 标题:“qqhelp” 1. **项目类型**: 标题“qqhelp”暗示这是一个与QQ相关的帮助工具或项目。QQ是中国流行的即时通讯软件,因此这个标题表明项目可能提供了对QQ客户端功能的辅助或扩展。 2. **用途**: “help”表明此项目的主要目的是提供帮助或解决问题。由于它提到了QQ,并且涉及“autosend/reply”功能,我们可以推测该项目可能用于自动化发送消息回复,或提供某种形式的自动回复机制。 ### 描述:“I put it to my web, but nobody sendmessage to got the source, now I public it. it supply qq,ticq autosend/reply ,full sourcecode use it as you like” 1. **发布情况**: 描述提到该项目原先被放置在某人的网站上,并且没有收到请求源代码的消息。这可能意味着项目不够知名或者需求不高。现在作者决定公开发布,这可能是因为希望项目能够被更多人了解和使用,或是出于开源共享的精神。 2. **功能特性**: 提到的“autosend/reply”表明该项目能够实现自动发送和回复消息。这种功能对于需要进行批量或定时消息沟通的应用场景非常有用,例如客户服务、自动化的营销通知等。 3. **代码可用性**: 作者指出提供了“full sourcecode”,意味着源代码完全开放,用户可以自由使用,无论是查看、学习还是修改,用户都有很大的灵活性。这对于希望学习编程或者有特定需求的开发者来说是一个很大的优势。 ### 标签:“综合系统类” 1. **项目分类**: 标签“综合系统类”表明这个项目可能是一个多功能的集成系统,它可能不仅限于QQ相关的功能,还可能包含了其他类型的综合服务或特性。 2. **技术范畴**: 这个标签可能表明该项目的技术实现比较全面,可能涉及到了多个技术栈或者系统集成的知识点,例如消息处理、网络编程、自动化处理等。 ### 压缩包子文件的文件名称列表: 1. **Unit1.dfm**: 这是一个Delphi或Object Pascal语言的窗体定义文件,用于定义应用程序中的用户界面布局。DFM文件通常用于存储组件的属性和位置信息,使得开发者可以快速地进行用户界面的设计和调整。 2. **qqhelp.dpr**: DPR是Delphi项目文件的扩展名,包含了Delphi项目的核心设置,如程序入口、使用的单元(Units)等。这个文件是编译和构建Delphi项目的起点,它能够帮助开发者了解项目的组织结构和编译指令。 3. **Unit1.pas**: PAS是Delphi或Object Pascal语言的源代码文件。这个文件可能包含了与QQ帮助工具相关的核心逻辑代码,例如处理自动发送和回复消息的算法等。 4. **readme.txt**: 这是一个常见的文本文件,包含项目的基本说明和使用指导,帮助用户了解如何获取、安装、运行和定制该项目。README文件通常是用户与项目首次交互时首先阅读的文件,因此它对于一个开源项目的用户友好度有着重要影响。 通过以上分析,我们可以看出“qqhelp”项目是一个针对QQ通讯工具的自动化消息发送与回复的辅助工具。项目包含完整的源代码,用户可以根据自己的需要进行查看、修改和使用。它可能包含Delphi语言编写的窗体界面和后端逻辑代码,具有一定的综合系统特性。项目作者出于某种原因将其开源,希望能够得到更广泛的使用和反馈。
recommend-type

【7步打造Win11深度学习利器】:Tensorflow-GPU与RTX4080终极优化指南

# 1. 深度学习与Windows 11的融合 在人工智能时代,深度学习已渗透到生活的方方面面,而Windows 11作为最新一代的操作系统,为深度学习提供了一个高效的工作平台。本章节将探讨深度学习技术如何与Windows 11系统融合,以及这一
recommend-type

ue画笔画画蓝图版

<think>我们正在讨论的是在UnrealEngine中使用蓝图实现画笔绘画功能。根据用户需求,重点在于通过蓝图系统实现类似毛笔的绘画效果。结合之前的回答和引用内容,我们将详细展开实现方法。核心思路:通过捕捉输入轨迹,动态生成笔触网格,并应用材质模拟墨迹效果。###详细实现步骤####1.创建绘画蓝图创建一个名为`BP_PaintBrush`的Actor蓝图:-**根组件**:SceneComponent-**关键组件**:-`SplineComponent`:用于存储绘画路径点-`InstancedStaticMeshComponent`:高效渲染重复笔触段(替代单个SplineMesh组
recommend-type

VB.NET图表曲线组件实现多种图表绘制

在深入讨论所给文件信息中的知识点之前,我们首先需要明确这些信息所代表的内容。标题指出我们所讨论的是一款在VB.NET环境中使用的“三维图表曲线组件”。从描述中我们可以了解到该组件的功能特性,即它能够绘制包括柱状图、线条曲线图和饼图在内的多种类型图表,并且支持图例的展示。此外,组件的色彩使用比较鲜艳,它不仅适用于标准的Windows Forms应用程序,还能够在ASP.NET环境中使用。而“压缩包子文件的文件名称列表”提供的信息则指向了可能包含该组件示例代码或说明文档的文件名,例如“PSC_ReadMe_4556_10.txt”可能是一个说明文档,而“GraphingV3Testing”和“Graphing.V3”则可能是一些测试文件或组件的实际使用案例。 下面详细说明标题和描述中提到的知识点: 1. VB.NET环境中的图表组件开发: 在VB.NET中开发图表组件需要开发者掌握.NET框架的相关知识,包括但不限于Windows Forms应用程序的开发。VB.NET作为.NET框架的一种语言实现,它继承了.NET框架的面向对象特性和丰富的类库支持。图表组件作为.NET类库的一部分,开发者可以通过继承相关类、使用系统提供的绘图接口来设计和实现图形用户界面(GUI)中用于显示图表的部分。 2. 图表的类型和用途: - 柱状图:主要用于比较各类别数据的数量大小,通过不同长度的柱子来直观显示数据间的差异。 - 线条曲线图:适用于展示数据随时间或顺序变化的趋势,比如股票价格走势、温度变化等。 - 饼图:常用于展示各部分占整体的比例关系,可以帮助用户直观地了解数据的组成结构。 3. 图例的使用和意义: 图例在图表中用来说明不同颜色或样式所代表的数据类别或系列。它们帮助用户更好地理解图表中的信息,是可视化界面中重要的辅助元素。 4. ASP.NET中的图表应用: ASP.NET是微软推出的一种用于构建动态网页的框架,它基于.NET平台运行。在ASP.NET中使用图表组件意味着可以创建动态的图表,这些图表可以根据Web应用程序中实时的数据变化进行更新。比如,一个电子商务网站可能会利用图表组件来动态显示产品销售排行或用户访问统计信息。 5. 色彩运用: 在设计图表组件时,色彩的运用非常关键。色彩鲜艳不仅能够吸引用户注意,还能够帮助用户区分不同的数据系列。正确的色彩搭配还可以提高信息的可读性和美观性。 在技术实现层面,开发者可能需要了解如何在VB.NET中使用GDI+(Graphics Device Interface)进行图形绘制,掌握基本的绘图技术(如画线、填充、颜色混合等),并且熟悉.NET提供的控件(如Panel, Control等)来承载和显示这些图表。 由于提供的文件名列表中包含有"Testing"和".txt"等元素,我们可以推测该压缩包内可能还包含了与图表组件相关的示例程序和使用说明,这对于学习如何使用该组件将十分有用。例如,“GraphingV3Testing”可能是一个测试项目,用于在真实的应用场景中检验该图表组件的功能和性能;“PSC_ReadMe_4556_10.txt”可能是一个详细的用户手册或安装说明,帮助用户了解如何安装、配置和使用该组件。 总结而言,了解并掌握在VB.NET环境下开发和使用三维图表曲线组件的知识点,对从事.NET开发的程序员来说,不仅可以增强他们在数据可视化方面的技能,还可以提高他们构建复杂界面和动态交互式应用的能力。
recommend-type

【MultiExtractor_Pro实战演练】:8个复杂场景的高效数据提取解决方案

# 摘要 本文介绍了MultiExtractor_Pro工具的概述、基本使用技巧、实战演练、高级功能应用以及案例研究与展望。首先,详细说明了MultiExtractor_Pro的安装过程和用户界面布局,阐述了核心功能组件及其操作方法。接着,讲述了配置提取模板、设置提取任务以及实时数据提取与预览技巧。在实