196 lines
5.4 KiB
C++
196 lines
5.4 KiB
C++
#include <qwidget.h>
|
|
#include <qpainter.h>
|
|
#include <Qlabel>
|
|
#include <opencv.hpp>
|
|
#include <qmovie.h>
|
|
#include <qlayout.h>
|
|
#include <qtextedit.h>;
|
|
#include <global.h>
|
|
#include <components/fancyButton.h>
|
|
#include <qmutex.h>
|
|
#include <qtBridge.h>
|
|
class MainWindow;
|
|
class loadingWidget : public QWidget {
|
|
public:
|
|
bool initOK = false;
|
|
bool isRunning = false;
|
|
QLabel* sign = nullptr;
|
|
QMovie* movie = nullptr;
|
|
QTextEdit* initLog = nullptr;
|
|
QTextEdit* consoleLog = nullptr;
|
|
fancyButtonText* retryBtn = new fancyButtonText("重试", 100, 50, "重新进行初始化");
|
|
fancyButtonText* manualBtn = new fancyButtonText("离线模式", 180, 50, "离线模式");
|
|
QGridLayout* glayout = new QGridLayout(this);
|
|
QGridLayout* logLayout = new QGridLayout(this);
|
|
loadingWidget(qtFuncBridge* bridgeIn){
|
|
bridge = bridgeIn;
|
|
glayout->setAlignment(Qt::AlignCenter);
|
|
connect(retryBtn, &QPushButton::clicked, [=]()
|
|
{
|
|
retryBtn->setDisabled(true);
|
|
start();
|
|
emit bridge->reInitConfig();
|
|
});
|
|
}
|
|
void start(){
|
|
if (isRunning == true)
|
|
stop();
|
|
QPalette palette;
|
|
palette.setColor(QPalette::WindowText, Qt::white);
|
|
sign = new QLabel(this);
|
|
sign->setAlignment(Qt::AlignBottom| Qt::AlignHCenter);
|
|
|
|
movie = new QMovie(":/icon/icon/loading.gif");
|
|
movie->setScaledSize(QSize(100, 100));
|
|
movie->start();
|
|
|
|
sign->setMovie(movie);
|
|
//初始化日志
|
|
initLog = new QTextEdit();
|
|
initLog->setAlignment(Qt::AlignCenter);
|
|
initLog->setStyleSheet(QString("background-color: transparent;"
|
|
"border: 0px solid red;"
|
|
"border-radius: 0px;"));
|
|
initLog->setReadOnly(true);
|
|
QFont font("微软雅黑", 8);
|
|
|
|
initLog->setFont(font);
|
|
initLog->setTextColor(Qt::white);
|
|
initLog->append("正在初始化...");
|
|
|
|
logLayout->addWidget(initLog, 0, 0);
|
|
|
|
//控制台日志
|
|
consoleLog = new QTextEdit();
|
|
consoleLog->setAlignment(Qt::AlignCenter);
|
|
consoleLog->setStyleSheet(QString("background-color: black;"
|
|
"border: 1px solid white;"
|
|
"border-radius: 0px;"));
|
|
consoleLog->setReadOnly(true);
|
|
consoleLog->setFixedWidth(720);
|
|
QFont font2("微软雅黑", 7);
|
|
consoleLog->setFont(font2);
|
|
consoleLog->setTextColor(Qt::white);
|
|
consoleLog->append("控制台日志...");
|
|
logLayout->addWidget(consoleLog, 1, 0,Qt::AlignCenter|Qt::AlignTop);
|
|
|
|
//重试或者离线模式等按钮
|
|
QHBoxLayout* btnLayout = new QHBoxLayout();
|
|
btnLayout->setAlignment(Qt::AlignLeft);
|
|
btnLayout->addWidget(manualBtn);
|
|
manualBtn->hide();
|
|
btnLayout->addWidget(retryBtn);
|
|
retryBtn->hide();
|
|
|
|
logLayout->addLayout(btnLayout, 2, 0,Qt::AlignLeft);
|
|
|
|
glayout->addWidget(sign, 0, 0);
|
|
glayout->addLayout(logLayout, 1, 0);
|
|
glayout->setRowStretch(0, 5);
|
|
glayout->setRowStretch(1, 4);
|
|
//screenshot_ = QPixmap::grabWindow(widget->winId());
|
|
update(); // 更新widget以显示新的截图
|
|
isRunning = true;
|
|
initOK = true;
|
|
}
|
|
void stop(){
|
|
if (isRunning == false)
|
|
return;
|
|
isRunning = false;
|
|
delete sign;
|
|
if (movie != nullptr)
|
|
delete movie;
|
|
delete initLog;
|
|
|
|
sign = nullptr;
|
|
movie = nullptr;
|
|
initLog = nullptr;
|
|
}
|
|
void setError(){
|
|
if (isRunning == true){
|
|
if (movie != nullptr)
|
|
delete movie;
|
|
movie = nullptr;
|
|
sign->setPixmap(QPixmap(":/icon/icon/error.png"));
|
|
retryBtn->show();
|
|
retryBtn->setEnabled(true);
|
|
manualBtn->show();
|
|
manualBtn->setEnabled(true);
|
|
}
|
|
}
|
|
int appendConsoleLog(const QString& text) {
|
|
if (consoleLog && initOK == true) {
|
|
QMutexLocker locker(&mutex);
|
|
consoleLog->append(text);
|
|
return consoleLog->document()->blockCount();
|
|
}
|
|
return -1;
|
|
}
|
|
int appendInitLog(const QString& text, const QColor& color = Qt::white) {
|
|
if (initLog && initOK == true) {
|
|
QMutexLocker locker(&mutex);
|
|
initLog->setTextColor(color);
|
|
initLog->append(text);
|
|
// 恢复为白色,避免影响后续日志
|
|
initLog->setTextColor(Qt::white);
|
|
// 返回当前行数
|
|
return initLog->document()->blockCount();
|
|
}
|
|
return -1;
|
|
}
|
|
void modifyLog(int col, const QString& text, const QColor& color) {
|
|
if (!initLog) return;
|
|
QTextCursor cursor = initLog->textCursor();
|
|
cursor.movePosition(QTextCursor::Start);
|
|
for (int i = 0; i < col; ++i) {
|
|
if (!cursor.movePosition(QTextCursor::Down))
|
|
return; // 超出行数
|
|
}
|
|
cursor.select(QTextCursor::LineUnderCursor);
|
|
cursor.removeSelectedText();
|
|
cursor.insertText(text, QTextCharFormat());
|
|
// 设置颜色
|
|
QTextCharFormat fmt;
|
|
fmt.setForeground(color);
|
|
cursor.select(QTextCursor::LineUnderCursor);
|
|
cursor.mergeCharFormat(fmt);
|
|
// 恢复为白色
|
|
QTextCharFormat resetFmt;
|
|
resetFmt.setForeground(Qt::white);
|
|
cursor.setCharFormat(resetFmt);
|
|
}
|
|
void clearLog() {
|
|
initLog->clear();
|
|
consoleLog->clear();
|
|
}
|
|
protected:
|
|
#if 0
|
|
//void paintEvent(QPaintEvent* event) override {
|
|
// if (paintOnce == false)
|
|
// return;
|
|
// if (screenshot_.isNull())
|
|
// return;
|
|
// paintOnce = false;
|
|
// QImage image = screenshot_.toImage();
|
|
// image = image.convertToFormat(QImage::Format_RGB888);
|
|
// cv::Mat originalMat = cv::Mat(
|
|
// image.height(),
|
|
// image.width(),
|
|
// CV_8UC3,
|
|
// image.bits(),
|
|
// image.bytesPerLine());
|
|
// cv::Mat blurredMat;
|
|
// cv::blur(originalMat, blurredMat, cv::Size(10, 10)); // 调整模糊半径以获得不同程度的模糊效果
|
|
// QPixmap blurredPixmap = cvMatToQPixmap(blurredMat);
|
|
// QPainter painter(this);
|
|
// painter.drawPixmap(0, 0, blurredPixmap);
|
|
// //QWidget::paintEvent(event); // 调用父类的 paintEvent 函数,绘制控件本身
|
|
|
|
//}
|
|
#endif
|
|
private:
|
|
QPixmap screenshot_;
|
|
QMutex mutex;
|
|
qtFuncBridge* bridge;
|
|
};
|
|
#pragma once |