2022-01-04 18:11:48 +08:00
|
|
|
|
#include "mainwindow.h"
|
2023-04-18 14:14:46 +08:00
|
|
|
|
#include "gutil/qgui.h"
|
2022-08-25 18:37:24 +08:00
|
|
|
|
#include "cfg.h"
|
2023-05-15 16:06:10 +08:00
|
|
|
|
#include "globaldefine.h"
|
2023-08-01 11:42:41 +08:00
|
|
|
|
#include "devicepanel.h"
|
|
|
|
|
#include "gutil/qnetwork.h"
|
2023-04-18 14:14:46 +08:00
|
|
|
|
#include "device/upgradeapkdialog.h"
|
2022-08-25 18:37:24 +08:00
|
|
|
|
#include <QColorDialog>
|
|
|
|
|
#include <QDesktopServices>
|
|
|
|
|
#include <QMenu>
|
|
|
|
|
#include <QMessageBox>
|
2022-01-04 18:11:48 +08:00
|
|
|
|
#include <QProcess>
|
2022-08-25 18:37:24 +08:00
|
|
|
|
#include <QSettings>
|
2022-09-28 18:21:57 +08:00
|
|
|
|
#include <QButtonGroup>
|
2022-09-30 18:08:39 +08:00
|
|
|
|
#include <QHeaderView>
|
2023-04-19 14:42:06 +08:00
|
|
|
|
#include <QStandardPaths>
|
2023-05-18 18:24:40 +08:00
|
|
|
|
#include <QDialogButtonBox>
|
2023-08-01 11:42:41 +08:00
|
|
|
|
#include <QToolButton>
|
2023-09-19 11:49:20 +08:00
|
|
|
|
#include <QDir>
|
|
|
|
|
#include <QCoreApplication>
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
2022-09-06 23:40:02 +08:00
|
|
|
|
extern QPoint gPlayPos;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
|
|
|
|
class ImgBtn : public QToolButton {
|
|
|
|
|
public:
|
|
|
|
|
ImgBtn() {
|
|
|
|
|
auto policy = sizePolicy();
|
|
|
|
|
policy.setHorizontalPolicy(QSizePolicy::Preferred);
|
|
|
|
|
setSizePolicy(policy);
|
|
|
|
|
connect(this, &QToolButton::toggled, this, [this](bool checked) {
|
|
|
|
|
setIcon(icons[checked ? 1 : 0]);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
void setIcons(const QIcon &unchecked, const QIcon &checked) {
|
|
|
|
|
setIcon(unchecked);
|
|
|
|
|
icons[0] = unchecked;
|
|
|
|
|
icons[1] = checked;
|
|
|
|
|
}
|
|
|
|
|
protected:
|
2023-04-19 14:42:06 +08:00
|
|
|
|
#if(QT_VERSION_MAJOR > 5)
|
|
|
|
|
void enterEvent(QEnterEvent *) override {
|
|
|
|
|
#else
|
2022-08-25 18:37:24 +08:00
|
|
|
|
void enterEvent(QEvent *) override {
|
2023-04-19 14:42:06 +08:00
|
|
|
|
#endif
|
2022-08-25 18:37:24 +08:00
|
|
|
|
if(this->isChecked()) return;
|
|
|
|
|
setIcon(icons[1]);
|
|
|
|
|
}
|
|
|
|
|
void leaveEvent(QEvent *) override {
|
|
|
|
|
if(this->isChecked()) return;
|
|
|
|
|
setIcon(icons[0]);
|
|
|
|
|
}
|
|
|
|
|
QIcon icons[2];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
MainWindow::MainWindow(QWidget *parent) : BaseWin(parent) {
|
2023-04-18 14:14:46 +08:00
|
|
|
|
setAttribute(Qt::WA_AlwaysShowToolTips);
|
2023-08-01 11:42:41 +08:00
|
|
|
|
auto ft = font();
|
|
|
|
|
ft.setPixelSize(14);
|
|
|
|
|
setFont(ft);
|
|
|
|
|
|
|
|
|
|
auto menuLang = new QMenu;
|
2023-04-18 14:14:46 +08:00
|
|
|
|
|
|
|
|
|
auto actCN = new QAction("中文");
|
2022-08-25 18:37:24 +08:00
|
|
|
|
actCN->setCheckable(true);
|
|
|
|
|
actCN->setObjectName("zh_CN");
|
2023-04-18 14:14:46 +08:00
|
|
|
|
menuLang->addAction(actCN);
|
|
|
|
|
|
|
|
|
|
auto actTW = new QAction("中文繁体");
|
2022-08-25 18:37:24 +08:00
|
|
|
|
actTW->setCheckable(true);
|
|
|
|
|
actTW->setObjectName("zh_TW");
|
2023-04-18 14:14:46 +08:00
|
|
|
|
menuLang->addAction(actTW);
|
|
|
|
|
|
|
|
|
|
auto actEn = new QAction("English");
|
2022-08-25 18:37:24 +08:00
|
|
|
|
actEn->setCheckable(true);
|
|
|
|
|
actEn->setObjectName("en");
|
2023-04-18 14:14:46 +08:00
|
|
|
|
menuLang->addAction(actEn);
|
|
|
|
|
|
|
|
|
|
auto actJa = new QAction("日本語");
|
2022-08-25 18:37:24 +08:00
|
|
|
|
actJa->setCheckable(true);
|
|
|
|
|
actJa->setObjectName("ja");
|
|
|
|
|
menuLang->addAction(actJa);
|
2023-04-18 14:14:46 +08:00
|
|
|
|
|
2023-09-19 11:49:20 +08:00
|
|
|
|
auto actPt = new QAction("Português");
|
|
|
|
|
actPt->setCheckable(true);
|
|
|
|
|
actPt->setObjectName("pt");
|
|
|
|
|
menuLang->addAction(actPt);
|
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
langGrp = new QActionGroup(menuLang);
|
|
|
|
|
langGrp->addAction(actCN);
|
|
|
|
|
langGrp->addAction(actTW);
|
|
|
|
|
langGrp->addAction(actEn);
|
|
|
|
|
langGrp->addAction(actJa);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
langGrp->addAction(actPt);
|
2023-04-18 14:14:46 +08:00
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
connect(menuLang, &QMenu::triggered, this, [this](QAction* action) {
|
|
|
|
|
auto lanName = action->objectName();
|
2023-09-19 11:49:20 +08:00
|
|
|
|
qInfo() << "load translators" << lanName << translator.load("app_"+lanName, ":/i18n");
|
2022-08-25 18:37:24 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
QSettings settings;
|
|
|
|
|
QString langName = settings.value("Language").toString();
|
2023-08-01 11:42:41 +08:00
|
|
|
|
QAction *actLan = 0;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
if(! langName.isEmpty()) {
|
|
|
|
|
if(langName.endsWith("CN")) actLan = actCN;
|
|
|
|
|
else if(langName.endsWith("TW")) actLan = actTW;
|
|
|
|
|
else if(langName.startsWith("en")) actLan = actEn;
|
|
|
|
|
else if(langName.startsWith("ja")) actLan = actJa;
|
2023-09-19 11:49:20 +08:00
|
|
|
|
else if(langName.startsWith("pt")) actLan = actPt;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
}
|
2023-08-01 11:42:41 +08:00
|
|
|
|
if(actLan==0) {
|
2022-08-25 18:37:24 +08:00
|
|
|
|
langName = QLocale().name();
|
|
|
|
|
if(langName.endsWith("TW")) actLan = actTW;
|
|
|
|
|
else if(langName.startsWith("en")) actLan = actEn;
|
|
|
|
|
else if(langName.startsWith("ja")) actLan = actJa;
|
2023-09-19 11:49:20 +08:00
|
|
|
|
else if(langName.startsWith("pt")) actLan = actPt;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
else actLan = actCN;
|
|
|
|
|
}
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
actLan->setChecked(true);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
emit menuLang->triggered(actLan);
|
|
|
|
|
QCoreApplication::installTranslator(&translator);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
|
|
|
|
auto geo = settings.value("MainGeo").toRect();
|
2023-04-18 14:14:46 +08:00
|
|
|
|
if(geo.width()>=800 && geo.height()>=500 && geo.x()>=-600 && geo.x()<=1280 && geo.y()>=-200 && geo.y()<=800) setGeometry(geo);
|
|
|
|
|
else resize(1280, 800);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
if(settings.value("MainIsMax", false).toBool()) setWindowState(Qt::WindowMaximized);
|
|
|
|
|
|
2022-09-06 23:40:02 +08:00
|
|
|
|
gPlayPos = settings.value("PlayPos").toPoint();
|
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
setWindowTitle("LedOK Express");
|
|
|
|
|
icon.load(":/res/Logo.png");
|
|
|
|
|
titlePos = QPointF(26, 80);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
iconPos = QRectF(38, 20, 64, 64);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
auto plt = palette();
|
|
|
|
|
plt.setBrush(QPalette::Window, QColor(0xdddddd));
|
|
|
|
|
setPalette(plt);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
|
|
|
|
//项目保存的文档路径
|
2022-08-25 18:37:24 +08:00
|
|
|
|
QString doc_path = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
if(!doc_path.isEmpty()) {
|
2023-09-19 11:49:20 +08:00
|
|
|
|
QDir app_dir = QDir(doc_path + "/" + QCoreApplication::applicationName());
|
2022-01-04 18:11:48 +08:00
|
|
|
|
if(!app_dir.exists()) {
|
|
|
|
|
QDir doc_dir(doc_path);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
doc_dir.mkdir(QCoreApplication::applicationName());
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//创建一个垂直布局
|
2023-08-01 11:42:41 +08:00
|
|
|
|
auto vBox = new VBox(center);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
vBox->setContentsMargins(0, 0, 0, 0);
|
|
|
|
|
vBox->setSpacing(0);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
//自定义的标题上的工具栏创建(语言和设置选项)
|
|
|
|
|
m_wTitle = new LoQTitleBar(this);
|
|
|
|
|
installEventFilter(m_wTitle);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
//水平布局,放置配置按钮,最小化,最大化,关闭按钮
|
|
|
|
|
QHBoxLayout *pLayout = new QHBoxLayout(m_wTitle);
|
|
|
|
|
pLayout->setContentsMargins(0, 0, 0, 0);
|
|
|
|
|
pLayout->addStretch();
|
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
bn_Setting = new QPushButton;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
bn_Setting->setIcon(QIcon(":/res/AppSetting.png"));
|
2023-04-18 14:14:46 +08:00
|
|
|
|
bn_Setting->setToolTip(tr("Setting"));
|
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
pLayout->addWidget(bn_Setting);
|
|
|
|
|
pLayout->addWidget(m_wTitle->bn_Minimize);
|
|
|
|
|
pLayout->addWidget(m_wTitle->bn_Maximize);
|
|
|
|
|
pLayout->addWidget(m_wTitle->bn_Close);
|
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
auto menu_setting = new QMenu;
|
|
|
|
|
act_lang = new QAction;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
act_lang->setMenu(menuLang);
|
|
|
|
|
menu_setting->addAction(act_lang);
|
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
actFirmware = new QAction(tr("firmware manager"));
|
|
|
|
|
connect(actFirmware, &QAction::triggered, this, [this] {
|
2023-09-19 11:49:20 +08:00
|
|
|
|
new UpgradeApkDialog(this);
|
2023-08-01 11:42:41 +08:00
|
|
|
|
});
|
|
|
|
|
menu_setting->addAction(actFirmware);
|
|
|
|
|
|
|
|
|
|
actPreferences = new QAction(tr("Preferences"));
|
|
|
|
|
connect(actPreferences, &QAction::triggered, this, [this] {
|
|
|
|
|
QDialog dlg(this);
|
|
|
|
|
dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, 0);
|
|
|
|
|
dlg.resize(400, 300);
|
|
|
|
|
dlg.setWindowTitle(tr("Preferences"));
|
|
|
|
|
auto vBox = new VBox(&dlg);
|
|
|
|
|
|
|
|
|
|
auto fdPress = new QCheckBox(tr("Video compress to")+" 720p");
|
|
|
|
|
fdPress->setChecked(gVideoCompress);
|
|
|
|
|
vBox->addWidget(fdPress);
|
|
|
|
|
|
|
|
|
|
auto fdTrans = new QCheckBox(tr("Video transcoding to")+" h264");
|
|
|
|
|
fdTrans->setChecked(gVideoTranscoding);
|
|
|
|
|
vBox->addWidget(fdTrans);
|
|
|
|
|
|
2023-09-19 11:49:20 +08:00
|
|
|
|
auto hBox = new HBox(vBox);
|
|
|
|
|
hBox->setContentsMargins(-1, 0, -1, -1);
|
2023-08-01 11:42:41 +08:00
|
|
|
|
|
|
|
|
|
auto fdAnti = new QCheckBox(tr("Text antialiasing"));
|
|
|
|
|
fdAnti->setChecked(gTextAntialiasing);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
hBox->addWidget(fdAnti, 0, Qt::AlignTop);
|
2023-08-01 11:42:41 +08:00
|
|
|
|
|
|
|
|
|
auto fdAntiTip = new QLabel(tr("TextAntilaTip"));
|
|
|
|
|
fdAntiTip->setStyleSheet("QLabel{color: #f00;}");
|
|
|
|
|
fdAntiTip->setWordWrap(true);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
hBox->addWidget(fdAntiTip, 1);
|
2023-08-01 11:42:41 +08:00
|
|
|
|
|
|
|
|
|
auto fdWidthSplit = new QCheckBox(tr("Width Split"));
|
|
|
|
|
fdWidthSplit->setChecked(gWidthSplit);
|
|
|
|
|
vBox->addWidget(fdWidthSplit);
|
|
|
|
|
|
2023-09-19 11:49:20 +08:00
|
|
|
|
hBox = new HBox(vBox);
|
|
|
|
|
hBox->addLabel(tr("Program Send Batch"));
|
|
|
|
|
auto fdSendBatch = new QSpinBox;
|
|
|
|
|
fdSendBatch->setRange(1, 20);
|
|
|
|
|
fdSendBatch->setValue(gSendBatch);
|
|
|
|
|
hBox->addWidget(fdSendBatch);
|
|
|
|
|
hBox->addStretch();
|
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
auto fdHideDetect = new QCheckBox(tr("Hide Detect Button"));
|
|
|
|
|
fdHideDetect->setChecked(gHideDetect);
|
|
|
|
|
vBox->addWidget(fdHideDetect);
|
|
|
|
|
|
|
|
|
|
auto fdShowLora = new QCheckBox(tr("Show Lora Screen"));
|
|
|
|
|
fdShowLora->setChecked(gShowLora);
|
|
|
|
|
vBox->addWidget(fdShowLora);
|
|
|
|
|
|
|
|
|
|
vBox->addStretch();
|
|
|
|
|
|
|
|
|
|
auto btnBox = new QDialogButtonBox(QDialogButtonBox::Ok);
|
|
|
|
|
connect(btnBox, &QDialogButtonBox::accepted, &dlg, [=, &dlg] {
|
|
|
|
|
QSettings settings;
|
|
|
|
|
settings.setValue("VideoCompress", gVideoCompress = fdPress->isChecked());
|
|
|
|
|
settings.setValue("VideoTranscoding", gVideoTranscoding = fdTrans->isChecked());
|
|
|
|
|
settings.setValue("TextAntialiasing", gTextAntialiasing = fdAnti->isChecked());
|
|
|
|
|
settings.setValue("WidthSplit", gWidthSplit = fdWidthSplit->isChecked());
|
2023-09-19 11:49:20 +08:00
|
|
|
|
settings.setValue("SendBatch", gSendBatch = fdSendBatch->value());
|
2023-08-01 11:42:41 +08:00
|
|
|
|
settings.setValue("HideDetect", gHideDetect = fdHideDetect->isChecked());
|
|
|
|
|
settings.setValue("GuangYingPin", gShowLora = fdShowLora->isChecked());
|
|
|
|
|
dlg.accept();
|
|
|
|
|
});
|
|
|
|
|
vBox->addWidget(btnBox);
|
|
|
|
|
|
2023-04-18 14:14:46 +08:00
|
|
|
|
dlg.exec();
|
2023-08-01 11:42:41 +08:00
|
|
|
|
fdDetectCard->setVisible(! gHideDetect);
|
|
|
|
|
mBtnGrp->button(MainPage_LoraScreen)->setVisible(gShowLora);
|
2023-04-18 14:14:46 +08:00
|
|
|
|
});
|
2023-08-01 11:42:41 +08:00
|
|
|
|
menu_setting->addAction(actPreferences);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
|
|
|
|
act_update = new QAction(tr("Check for updates"));
|
2023-04-18 14:14:46 +08:00
|
|
|
|
connect(act_update, &QAction::triggered, this, [this] {
|
2023-05-18 18:24:40 +08:00
|
|
|
|
{
|
|
|
|
|
QDialog dlg(this);
|
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
|
|
|
|
#endif
|
|
|
|
|
dlg.setWindowTitle(tr("Software Update"));
|
|
|
|
|
dlg.resize(500, 400);
|
|
|
|
|
|
|
|
|
|
auto vBox = new VBox(&dlg);
|
|
|
|
|
|
|
|
|
|
auto label = new QLabel(tr("CurVersion")+": "+APP_VERSION);
|
|
|
|
|
auto font = label->font();
|
|
|
|
|
font.setPixelSize(18);
|
|
|
|
|
label->setFont(font);
|
|
|
|
|
vBox->addWidget(label);
|
|
|
|
|
|
|
|
|
|
label = new QLabel(hasNewVer ? tr("Latest Version")+": "+updates["ver"].toString() : tr("The current version is already the latest version"));
|
|
|
|
|
vBox->addWidget(label);
|
|
|
|
|
|
|
|
|
|
label = new QLabel(tr("Update Log")+":");
|
|
|
|
|
vBox->addWidget(label);
|
|
|
|
|
|
|
|
|
|
auto fdUpdLog = new QTextEdit;
|
|
|
|
|
fdUpdLog->setReadOnly(true);
|
|
|
|
|
vBox->addWidget(fdUpdLog);
|
|
|
|
|
|
|
|
|
|
auto reply = NetReq(updates["changelog_zh_CN"].toString()).timeout(60000).get();
|
|
|
|
|
connect(reply, &QNetworkReply::finished, this, [=] {
|
|
|
|
|
auto err = errStr(reply);
|
|
|
|
|
if(! err.isEmpty()) {
|
|
|
|
|
qCritical()<<"Check Updates"<<err;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
fdUpdLog->setPlainText(reply->readAll());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
auto btnBox = new QDialogButtonBox;
|
|
|
|
|
if(hasNewVer) {
|
|
|
|
|
btnBox->addButton(tr("Download"), QDialogButtonBox::AcceptRole);
|
|
|
|
|
connect(btnBox, &QDialogButtonBox::accepted, &dlg, &QDialog::accept);
|
|
|
|
|
}
|
|
|
|
|
btnBox->addButton(QDialogButtonBox::Cancel);
|
|
|
|
|
connect(btnBox, &QDialogButtonBox::rejected, &dlg, &QDialog::reject);
|
|
|
|
|
vBox->addWidget(btnBox);
|
2023-04-18 14:14:46 +08:00
|
|
|
|
|
2023-05-18 18:24:40 +08:00
|
|
|
|
if(dlg.exec() != QDialog::Accepted) return;
|
|
|
|
|
}
|
|
|
|
|
auto filePath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) + "/ledok-express-updater";
|
|
|
|
|
auto url = updates["url"].toString();
|
|
|
|
|
auto idx = url.lastIndexOf('.');
|
|
|
|
|
if(idx!=-1) filePath += url.midRef(idx);
|
2023-05-18 19:14:40 +08:00
|
|
|
|
qDebug()<<"filePath"<<filePath;
|
2023-05-18 18:24:40 +08:00
|
|
|
|
QFile qFile(filePath);
|
|
|
|
|
if(! qFile.open(QFile::WriteOnly)) {
|
|
|
|
|
QMessageBox::critical(this, tr("Fail"), tr("Cannot Save File")+": "+qFile.errorString()+"\n"+filePath);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
QMessageBox msgBox(this);
|
|
|
|
|
msgBox.setStandardButtons(QMessageBox::Cancel);
|
|
|
|
|
msgBox.setWindowTitle(tr("Downloading updates"));
|
|
|
|
|
msgBox.setText(tr("Downloading updates")+": 0% ");
|
|
|
|
|
auto reply = NetReq(url).timeout(60000).get();
|
|
|
|
|
connect(&msgBox, &QMessageBox::rejected, reply, [reply] {
|
|
|
|
|
abortSilence(reply);
|
2023-04-18 14:14:46 +08:00
|
|
|
|
});
|
2023-05-18 18:24:40 +08:00
|
|
|
|
connect(reply, &QNetworkReply::downloadProgress, &msgBox, [&, reply](qint64 bytesReceived, qint64 bytesTotal) {
|
2023-08-01 11:42:41 +08:00
|
|
|
|
if(bytesTotal==0) return;
|
2023-05-18 18:24:40 +08:00
|
|
|
|
msgBox.setText(tr("Downloading updates")+": "+QString::number(bytesReceived*100/bytesTotal)+"% ");
|
|
|
|
|
qFile.write(reply->readAll());
|
|
|
|
|
});
|
|
|
|
|
connect(reply, &QNetworkReply::finished, &msgBox, [&, reply] {
|
|
|
|
|
auto err = errStr(reply);
|
|
|
|
|
if(! err.isEmpty()) {
|
|
|
|
|
msgBox.setIcon(QMessageBox::Critical);
|
|
|
|
|
msgBox.setText(tr("Error")+": "+err);
|
|
|
|
|
return;
|
2023-04-18 14:14:46 +08:00
|
|
|
|
}
|
2023-05-18 18:24:40 +08:00
|
|
|
|
msgBox.accept();
|
2023-04-18 14:14:46 +08:00
|
|
|
|
});
|
2023-05-18 18:24:40 +08:00
|
|
|
|
auto res = msgBox.exec();
|
|
|
|
|
qFile.close();
|
|
|
|
|
if(res != QDialog::Accepted) return;
|
2023-09-19 11:49:20 +08:00
|
|
|
|
QCoreApplication::quit();
|
2023-05-18 20:53:43 +08:00
|
|
|
|
QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));
|
2023-04-18 14:14:46 +08:00
|
|
|
|
});
|
2022-08-25 18:37:24 +08:00
|
|
|
|
menu_setting->addAction(act_update);
|
|
|
|
|
|
2023-05-18 18:24:40 +08:00
|
|
|
|
auto reply = NetReq(UpdVerUrl).timeout(60000).get();
|
|
|
|
|
connect(reply, &QNetworkReply::finished, this, [=] {
|
|
|
|
|
auto err = errStr(reply);
|
|
|
|
|
if(! err.isEmpty()) {
|
|
|
|
|
qCritical()<<"Check Updates"<<err;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
auto data = reply->readAll();
|
|
|
|
|
QJsonParseError jsonErr;
|
|
|
|
|
auto json = QJsonDocument::fromJson(data, &jsonErr);
|
|
|
|
|
if(jsonErr.error != QJsonParseError::NoError) {
|
|
|
|
|
qCritical()<<"Check Updates JsonError"<<jsonErr.errorString();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
updates = json["win"].toObject();
|
2023-05-18 19:14:40 +08:00
|
|
|
|
#endif
|
|
|
|
|
#ifdef Q_OS_MAC
|
2023-05-18 18:24:40 +08:00
|
|
|
|
updates = json["mac"].toObject();
|
|
|
|
|
#endif
|
|
|
|
|
if(verCompare(updates["ver"].toString(), APP_VERSION) > 0) {
|
|
|
|
|
hasNewVer = true;
|
|
|
|
|
bn_Setting->setIcon(QIcon(":/res/AppSettingTip.png"));
|
|
|
|
|
act_update->setIcon(QIcon(":/res/reddot.png"));
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
act_help = new QAction();
|
2023-04-18 14:14:46 +08:00
|
|
|
|
connect(act_help, &QAction::triggered, this, [this] {
|
|
|
|
|
auto act = langGrp->checkedAction();
|
|
|
|
|
if(act==0) return;
|
|
|
|
|
QDesktopServices::openUrl(QUrl::fromLocalFile(QCoreApplication::applicationDirPath()+"/help/"+act->objectName()+".pdf"));
|
|
|
|
|
});
|
2022-08-25 18:37:24 +08:00
|
|
|
|
menu_setting->addAction(act_help);
|
|
|
|
|
|
2023-04-18 14:14:46 +08:00
|
|
|
|
actInfo = new QAction;
|
2022-08-25 18:37:24 +08:00
|
|
|
|
connect(actInfo, &QAction::triggered, this, [this] {
|
2023-05-28 22:34:58 +08:00
|
|
|
|
QMessageBox::information(this, tr("Info"), QFileInfo("aaa.file").absoluteFilePath()
|
|
|
|
|
.append("\nSupportsSsl: ").append(QSslSocket::supportsSsl()?"true":"false")
|
2022-08-25 18:37:24 +08:00
|
|
|
|
.append("\nSslLibraryBuildVersion: ").append(QSslSocket::sslLibraryBuildVersionString().append(" (").append(QString::number(QSslSocket::sslLibraryBuildVersionNumber())).append(")"))
|
|
|
|
|
.append("\nSslLibraryVersion: ").append(QSslSocket::sslLibraryVersionString()).append(" (").append(QString::number(QSslSocket::sslLibraryVersionNumber())).append(")"));
|
|
|
|
|
});
|
|
|
|
|
menu_setting->addAction(actInfo);
|
|
|
|
|
|
|
|
|
|
act_about = new QAction(tr("About"));
|
2023-04-18 14:14:46 +08:00
|
|
|
|
connect(act_about, &QAction::triggered, this, [this] {
|
2023-04-23 10:04:49 +08:00
|
|
|
|
QDialog dlg(this);
|
|
|
|
|
dlg.setWindowFlag(Qt::WindowContextHelpButtonHint, false);
|
|
|
|
|
dlg.setWindowTitle(tr("About"));
|
|
|
|
|
|
|
|
|
|
auto hBox = new HBox(&dlg);
|
|
|
|
|
hBox->setContentsMargins(24, 24, 24, 24);
|
|
|
|
|
hBox->setSpacing(24);
|
|
|
|
|
|
|
|
|
|
auto label = new QLabel;
|
|
|
|
|
label->setPixmap(QPixmap(":/res/Logo.png"));
|
|
|
|
|
hBox->addWidget(label);
|
|
|
|
|
|
|
|
|
|
auto vBox = new VBox(hBox);
|
|
|
|
|
|
|
|
|
|
label = new QLabel("LedOK Express");
|
|
|
|
|
label->setAlignment(Qt::AlignCenter);
|
|
|
|
|
auto font = label->font();
|
|
|
|
|
font.setPixelSize(30);
|
|
|
|
|
label->setFont(font);
|
|
|
|
|
vBox->addWidget(label);
|
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
label = new QLabel("V" APP_VERSION" - " __DATE__);
|
2023-04-23 10:04:49 +08:00
|
|
|
|
font = label->font();
|
|
|
|
|
font.setPixelSize(18);
|
|
|
|
|
label->setFont(font);
|
|
|
|
|
label->setAlignment(Qt::AlignCenter);
|
|
|
|
|
vBox->addWidget(label);
|
|
|
|
|
|
|
|
|
|
label = new QLabel("<a href=\"https://www.ledok.cn/\">www.ledok.cn");
|
|
|
|
|
font = label->font();
|
|
|
|
|
font.setPixelSize(20);
|
|
|
|
|
label->setFont(font);
|
|
|
|
|
label->setAlignment(Qt::AlignCenter);
|
|
|
|
|
label->setOpenExternalLinks(true);
|
|
|
|
|
vBox->addWidget(label);
|
|
|
|
|
|
2023-04-18 14:14:46 +08:00
|
|
|
|
dlg.exec();
|
|
|
|
|
});
|
2022-08-25 18:37:24 +08:00
|
|
|
|
menu_setting->addAction(act_about);
|
|
|
|
|
bn_Setting->setMenu(menu_setting);//按钮上添加下拉菜单
|
|
|
|
|
|
|
|
|
|
vBox->addWidget(m_wTitle);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
//设备管理,节目管理,高级节目管理页创建
|
2022-09-30 18:08:39 +08:00
|
|
|
|
mDevicePanel = new DevicePanel(settings);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
auto hBox = new HBox(vBox);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
hBox->setSpacing(2);
|
2023-05-15 16:06:10 +08:00
|
|
|
|
hBox->addSpacing(144);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
|
|
|
|
mBtnGrp = new QButtonGroup(this);
|
|
|
|
|
for(int i=0; i<MainPage_End; i++) {
|
|
|
|
|
auto btn = new ImgBtn();
|
|
|
|
|
btn->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
|
|
|
|
|
btn->setCheckable(true);
|
|
|
|
|
btn->setIconSize(QSize(40,40));
|
|
|
|
|
btn->setProperty("ss", "MainTab");
|
|
|
|
|
if(i==MainPage_DeviceManager) btn->setIcons(QIcon{":/res/DeviceManager_u.png"}, QIcon{":/res/DeviceManager_s.png"});
|
|
|
|
|
else if(i==MainPage_ProgManager) btn->setIcons(QIcon{":/res/ProgramManager_u.png"}, QIcon{":/res/ProgramManager_s.png"});
|
|
|
|
|
else if(i==MainPage_Setting) btn->setIcons(QIcon{":/res/DeviceSetting_u.png"}, QIcon{":/res/DeviceSetting_s.png"});
|
|
|
|
|
else if(i==MainPage_LoraScreen) btn->setIcons(QIcon{":/res/GuangYingPin_u.png"}, QIcon{":/res/GuangYingPin_s.png"});
|
|
|
|
|
hBox->addWidget(btn);
|
|
|
|
|
mBtnGrp->addButton(btn, i);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
wgts[MainPage_DeviceManager] = mDevicePanel;
|
|
|
|
|
wgts[MainPage_Setting] = mDevicePanel;
|
|
|
|
|
|
2023-05-15 16:06:10 +08:00
|
|
|
|
vBox->addWidget(wgts[mDevicePanel->mainPanelIdx]);//初始化响应页面为终端管理页面
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
2023-05-15 16:06:10 +08:00
|
|
|
|
mBtnGrp->button(mDevicePanel->mainPanelIdx)->setChecked(true);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
|
|
|
|
connect(mBtnGrp, &QButtonGroup::idToggled, this, [this, vBox](int id, bool checked) {
|
2023-05-15 16:06:10 +08:00
|
|
|
|
if(!checked || id==mDevicePanel->mainPanelIdx) return;
|
|
|
|
|
if((id!=MainPage_DeviceManager || mDevicePanel->mainPanelIdx!=MainPage_Setting) && (id!=MainPage_Setting || mDevicePanel->mainPanelIdx!=MainPage_DeviceManager)){
|
2023-08-01 11:42:41 +08:00
|
|
|
|
if(wgts[id]==0) {
|
|
|
|
|
if(id==MainPage_ProgManager) wgts[id] = mProgPanel = new ProgPanel(center);
|
|
|
|
|
else if(id==MainPage_LoraScreen) wgts[id] = m_wGuangYingPinWidget = new mGuangYingPinWidget;
|
|
|
|
|
}
|
2023-05-15 16:06:10 +08:00
|
|
|
|
vBox->replaceWidget(wgts[mDevicePanel->mainPanelIdx], wgts[id]);
|
|
|
|
|
wgts[mDevicePanel->mainPanelIdx]->setParent(0);
|
|
|
|
|
}
|
|
|
|
|
mDevicePanel->mainPanelIdx = id;
|
|
|
|
|
if(id==MainPage_DeviceManager) { //设备信息列表页面
|
2023-09-19 11:49:20 +08:00
|
|
|
|
mDevicePanel->mDeviceTable->hideColumn("check");
|
|
|
|
|
mDevicePanel->mDeviceTable->fdCheckAll->hide();
|
|
|
|
|
mDevicePanel->fdCardNumInfo->hide();
|
2023-05-15 16:06:10 +08:00
|
|
|
|
if(mDevicePanel->mDeviceCtrlPanel) {
|
2023-09-19 11:49:20 +08:00
|
|
|
|
for(int j="screenSize"**mDevicePanel->mDeviceTable; j<mDevicePanel->mDeviceTable->columnCount(); j++) mDevicePanel->mDeviceTable->showColumn(j);
|
2023-05-15 16:06:10 +08:00
|
|
|
|
mDevicePanel->mDeviceTable->setMaximumWidth(0xffffff);
|
|
|
|
|
mDevicePanel->mDeviceCtrlPanel->hide();
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
2023-05-15 16:06:10 +08:00
|
|
|
|
} else if(id==MainPage_Setting) { //终端控制页面
|
2023-09-19 11:49:20 +08:00
|
|
|
|
mDevicePanel->mDeviceTable->showColumn("check");
|
|
|
|
|
mDevicePanel->mDeviceTable->fdCheckAll->show();
|
|
|
|
|
mDevicePanel->fdCardNumInfo->show();
|
|
|
|
|
for(int j="screenSize"**mDevicePanel->mDeviceTable; j<mDevicePanel->mDeviceTable->columnCount(); j++) mDevicePanel->mDeviceTable->hideColumn(j);
|
2023-08-01 11:42:41 +08:00
|
|
|
|
if(mDevicePanel->mDeviceCtrlPanel) mDevicePanel->mDeviceCtrlPanel->show();
|
|
|
|
|
else mDevicePanel->newCtrl();
|
2023-05-15 16:06:10 +08:00
|
|
|
|
mDevicePanel->mDeviceTable->setMaximumWidth(340);
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
2022-08-25 18:37:24 +08:00
|
|
|
|
});
|
2022-01-04 18:11:48 +08:00
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
hBox = new HBox(vBox);
|
|
|
|
|
fdDetectCard = new QPushButton;
|
|
|
|
|
fdDetectCard->setCursor(Qt::PointingHandCursor);
|
|
|
|
|
fdDetectCard->setProperty("ssType", "progManageTool");
|
|
|
|
|
connect(fdDetectCard, &QPushButton::clicked, this, [this] {
|
2022-08-25 18:37:24 +08:00
|
|
|
|
auto res = QMessageBox::warning(this, tr("Tip Info"), tr("RestoreLedCardIpByUdpTip"), QMessageBox::Ok, QMessageBox::Cancel);
|
2023-05-15 16:06:10 +08:00
|
|
|
|
if(res != QMessageBox::Ok) return;
|
|
|
|
|
QList<QNetworkInterface> networkinterfaces = QNetworkInterface::allInterfaces();
|
2023-08-01 11:42:41 +08:00
|
|
|
|
foreach(QNetworkInterface interfaces, networkinterfaces) {//networkinterfaces负责提供主机的IP地址和网络接口的列表
|
|
|
|
|
foreach(QNetworkAddressEntry entry, interfaces.addressEntries()) {//QNetworkAddressEntry存储了一个IP地址,子网掩码和广播地址
|
2023-05-15 16:06:10 +08:00
|
|
|
|
entry.setBroadcast(QHostAddress::Broadcast);
|
|
|
|
|
QHostAddress broadcastAddress("255.255.255.255");
|
|
|
|
|
entry.setBroadcast(QHostAddress::Broadcast);
|
|
|
|
|
RESTORE_IP stTempIp;
|
|
|
|
|
memset(&stTempIp,0x00,sizeof(RESTORE_IP));
|
|
|
|
|
QString strNew=entry.ip().toString();
|
|
|
|
|
int itempOffset = strNew.lastIndexOf(".");
|
|
|
|
|
QString sstrNew=strNew.left(itempOffset)+".254";
|
|
|
|
|
if(sstrNew.length()<=20) memcpy(stTempIp.cNewIp,sstrNew.toLatin1().data(),sstrNew.length());
|
|
|
|
|
QString strMask=entry.netmask().toString();
|
|
|
|
|
if(strMask.length()<=20) memcpy(stTempIp.cMask,strMask.toLatin1().data(),strMask.length());
|
|
|
|
|
QString strGateway=entry.ip().toString();
|
|
|
|
|
if(strGateway.length()<=20) memcpy(stTempIp.cGateway,strGateway.toLatin1().data(),strGateway.length());
|
|
|
|
|
if(strGateway.length()<=20) memcpy(stTempIp.cDns,strGateway.toLatin1().data(),strGateway.length());
|
|
|
|
|
STREAM_PACKET packet;
|
|
|
|
|
memset(&packet, 0, sizeof(STREAM_PACKET));
|
|
|
|
|
memset(packet.SyncHead, 0x7e, 3);
|
|
|
|
|
memset(packet.ucSerialCode, 0x00, 20);
|
|
|
|
|
QByteArray ba("Broadcast!");
|
|
|
|
|
memcpy(packet.ucSerialCode, ba.data(), ba.size());
|
|
|
|
|
packet.iLength = 80;
|
2023-05-19 18:50:21 +08:00
|
|
|
|
packet.ucCommType = 0X43;
|
2023-05-15 16:06:10 +08:00
|
|
|
|
memcpy(packet.pDataBuffer, &stTempIp, 80);
|
|
|
|
|
packet.pDataBuffer[packet.iLength] = GetCheckCodeIn8(&packet.ucCommType,packet.iLength+sizeof(packet.ucCommType)+sizeof(char)*20+sizeof(packet.iLength));
|
|
|
|
|
int iLenPacket = packet.iLength+sizeof(int)+3*sizeof(unsigned char)+sizeof(char)+20*sizeof(char)+sizeof(char);/////除正文外的协议结构大小;
|
|
|
|
|
QUdpSocket *tempUdpSocket = new QUdpSocket(this);
|
|
|
|
|
if(!tempUdpSocket->bind(entry.ip())) break;
|
|
|
|
|
tempUdpSocket->writeDatagram((char *)&packet,iLenPacket,broadcastAddress, 31296);
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-08-25 18:37:24 +08:00
|
|
|
|
});
|
2023-08-01 11:42:41 +08:00
|
|
|
|
hBox->addWidget(fdDetectCard);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
hBox->addStretch();
|
|
|
|
|
|
2023-09-19 11:49:20 +08:00
|
|
|
|
hBox->addLabel("V" APP_VERSION" - " __DATE__);
|
2022-08-25 18:37:24 +08:00
|
|
|
|
|
2023-09-19 11:49:20 +08:00
|
|
|
|
gApkHome = settings.value("ApkHome").toString();
|
2022-10-27 15:07:45 +08:00
|
|
|
|
gVideoCompress = settings.value("VideoCompress", true).toBool();
|
|
|
|
|
gVideoTranscoding = settings.value("VideoTranscoding", true).toBool();
|
2022-08-25 18:37:24 +08:00
|
|
|
|
gTextAntialiasing = settings.value("TextAntialiasing", false).toBool();
|
2022-10-27 15:07:45 +08:00
|
|
|
|
gWidthSplit = settings.value("WidthSplit", false).toBool();
|
2023-09-19 11:49:20 +08:00
|
|
|
|
gSendBatch = settings.value("SendBatch", 5).toInt();
|
2023-08-01 11:42:41 +08:00
|
|
|
|
gHideDetect = settings.value("HideDetect", false).toBool();
|
|
|
|
|
gShowLora = settings.value("GuangYingPin", false).toBool();
|
2022-10-27 15:07:45 +08:00
|
|
|
|
|
2023-08-01 11:42:41 +08:00
|
|
|
|
if(gHideDetect) fdDetectCard->hide();
|
|
|
|
|
if(! gShowLora) mBtnGrp->button(MainPage_LoraScreen)->hide();
|
2022-08-25 18:37:24 +08:00
|
|
|
|
if(settings.value("AddFirewallFlag").toString() !="1") {
|
|
|
|
|
//添加exe到win防火墙例外
|
|
|
|
|
auto appFile = QCoreApplication::applicationFilePath();
|
|
|
|
|
appFile.replace('/','\\');
|
|
|
|
|
QProcess cmd;
|
|
|
|
|
connect(&cmd, &QProcess::readyReadStandardOutput, this, [&cmd] {
|
|
|
|
|
qDebug()<<"out"<<QString::fromLocal8Bit(cmd.readAllStandardOutput());
|
|
|
|
|
});
|
|
|
|
|
connect(&cmd, &QProcess::readyReadStandardError, this, [&cmd] {
|
|
|
|
|
qDebug()<<"err"<<QString::fromLocal8Bit(cmd.readAllStandardError());
|
|
|
|
|
});
|
|
|
|
|
qDebug()<<"Add Firewall"<<appFile;
|
|
|
|
|
cmd.start("netsh advfirewall firewall add rule name=\"allow LedOK\" dir=in program=\""+appFile+"\"", {"security=authnoencap", "action=allow"});
|
|
|
|
|
cmd.waitForFinished();
|
|
|
|
|
settings.setValue("AddFirewallFlag", "1");
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
transUi();
|
|
|
|
|
|
|
|
|
|
int ci = 0;
|
|
|
|
|
int grays[] = {0, 0x22, 0x44, 0x66, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};
|
|
|
|
|
for(; ci < 12; ci++) QColorDialog::setStandardColor(ci, QColor(grays[ci], grays[ci], grays[ci]));
|
|
|
|
|
int higs[] = {0x80, 0xff, 0xff};
|
|
|
|
|
int mids[] = {0x40, 0x80, 0xbf};
|
|
|
|
|
int lows[] = { 0, 0, 0x7f};
|
|
|
|
|
for(int i=0; i<3; i++) {
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(higs[i], lows[i], lows[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(higs[i], higs[i], lows[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(lows[i], higs[i], lows[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(lows[i], higs[i], higs[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(lows[i], lows[i], higs[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(higs[i], lows[i], higs[i]));
|
|
|
|
|
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(higs[i], lows[i], mids[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(higs[i], mids[i], lows[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(mids[i], higs[i], lows[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(lows[i], higs[i], mids[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(lows[i], mids[i], higs[i]));
|
|
|
|
|
QColorDialog::setStandardColor(ci++, QColor(mids[i], lows[i], higs[i]));
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-08-25 18:37:24 +08:00
|
|
|
|
MainWindow::~MainWindow() {
|
|
|
|
|
QSettings settings;
|
|
|
|
|
auto act = langGrp->checkedAction();
|
|
|
|
|
if(act) settings.setValue("Language", act->objectName());
|
|
|
|
|
settings.setValue("MainGeo", normalGeometry());
|
|
|
|
|
settings.setValue("MainIsMax", isMaximized());
|
2022-09-06 23:40:02 +08:00
|
|
|
|
settings.setValue("PlayPos", gPlayPos);
|
2023-09-19 11:49:20 +08:00
|
|
|
|
if(! gApkHome.isEmpty()) settings.setValue("ApkHome", gApkHome);
|
2022-09-28 18:21:57 +08:00
|
|
|
|
if(mDevicePanel->fdIP) {
|
2022-10-12 18:17:10 +08:00
|
|
|
|
auto ipstr = mDevicePanel->fdIP->toPlainText();
|
|
|
|
|
if(! ipstr.isEmpty()) settings.setValue("SpecifyIP", ipstr);
|
2023-04-18 14:14:46 +08:00
|
|
|
|
else settings.remove("SpecifyIP");
|
2022-09-28 18:21:57 +08:00
|
|
|
|
}
|
2023-08-01 11:42:41 +08:00
|
|
|
|
if(mProgPanel) {
|
|
|
|
|
settings.setValue("ProgramListSortColumn", mProgPanel->mProgTree->sortColumn());
|
|
|
|
|
settings.setValue("ProgramListSortOrder", mProgPanel->mProgTree->header()->sortIndicatorOrder());
|
|
|
|
|
}
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
2023-09-19 11:49:20 +08:00
|
|
|
|
|
2022-08-25 18:37:24 +08:00
|
|
|
|
void MainWindow::changeEvent(QEvent *event) {
|
|
|
|
|
BaseWin::changeEvent(event);
|
|
|
|
|
if(event->type() == QEvent::LanguageChange) transUi();
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|
2022-08-25 18:37:24 +08:00
|
|
|
|
void MainWindow::transUi() {
|
|
|
|
|
m_wTitle->refreshLable();
|
|
|
|
|
mBtnGrp->button(MainPage_DeviceManager)->setText(tr("Device"));
|
|
|
|
|
mBtnGrp->button(MainPage_ProgManager)->setText(tr("Program"));
|
|
|
|
|
mBtnGrp->button(MainPage_Setting)->setText(tr("Control"));
|
2023-08-01 11:42:41 +08:00
|
|
|
|
mBtnGrp->button(MainPage_LoraScreen)->setText(tr("Lora Screen"));
|
|
|
|
|
fdDetectCard->setText(tr("Check card"));
|
2022-08-25 18:37:24 +08:00
|
|
|
|
act_lang->setText(tr("Language"));
|
|
|
|
|
act_help->setText(tr("Help"));
|
2023-04-18 14:14:46 +08:00
|
|
|
|
actInfo->setText(tr("Info"));
|
2022-08-25 18:37:24 +08:00
|
|
|
|
act_about->setText(tr("About"));
|
|
|
|
|
act_update->setText(tr("Check for updates"));
|
2023-08-01 11:42:41 +08:00
|
|
|
|
actFirmware->setText(tr("firmware manager"));
|
|
|
|
|
actPreferences->setText(tr("Preferences"));
|
2022-08-25 18:37:24 +08:00
|
|
|
|
bn_Setting->setToolTip(tr("Setting"));
|
2022-01-04 18:11:48 +08:00
|
|
|
|
}
|