#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); mainWindowInit(); animationInit(); } void MainWindow::mainWindowInit() { /*设置全屏显示*/ this->setGeometry(0,0,QApplication::desktop()->screenGeometry().width(),QApplication::desktop()->screenGeometry().height()); //this->setGeometry(0,0,800,480); /*设置窗口的样式*/ this->setWindowFlags(Qt::FramelessWindowHint); this->setStyleSheet("QToolTip{border-radius:4;border:1px solid rgb(118, 118, 118); color:white; font-size:15px;}"); flagAppExec = true; scrollingFlag = false; //主Wiget,用于设置背景 mainWidget = new QWidget(this); this->setCentralWidget(mainWidget); if(this->width()<800) mainWidget->setStyleSheet("border-image:url(:/icon/330822.png)"); else mainWidget->setStyleSheet("border-image:url(:/icon/abc.png)"); mainWidget->installEventFilter(this); appWidgetParent = new QWidget(this); appWidgetParent->setGeometry((float)0/800*this->geometry().width(),(float)280/480*this->geometry().height(), this->geometry().width(),(float)200/800*this->geometry().width()); appWidgetParent->setStyleSheet("border-image:transparent"); appWidget = new QWidget(appWidgetParent); appWidget->setGeometry(0,0, 4*this->geometry().width(),(float)200/800*this->geometry().width()); appWidget->setStyleSheet("border-image:transparent"); appWidget->installEventFilter(this); loopCount = 0; QStringList strList; QFont font ( "PangMenZhengDao", 20, 40); font.setBold(true); font.setPixelSize((float)18/800*this->geometry().width()); strList<<"音乐"<<"媒体播放"<<"上网"<<"天气"<<"时钟"<<"文件"<<"相册"<<"计算器"<<"阅读" <<"记事本"<<"相机"<<"LED"<<"图片浏览器"<<"日历"<<"录音"<<"温度"<<"脚本测试"; /* 循环动画面板Widget位置与大小确定 */ for(int i = 0; i < 17; i++){ loopWidgetArr[i] = new QWidget(appWidget); switch (i) { case 0://音乐 loopWidgetArr[i]->setGeometry((float)25/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 1://媒体播放 loopWidgetArr[i]->setGeometry((float)180/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 2://上网 loopWidgetArr[i]->setGeometry((float)340/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 3://天气 loopWidgetArr[i]->setGeometry((float)500/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 4://时钟 loopWidgetArr[i]->setGeometry((float)655/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 5://文件 loopWidgetArr[i]->setGeometry((float)825/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 6://相册 loopWidgetArr[i]->setGeometry((float)980/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 7://计算器 loopWidgetArr[i]->setGeometry((float)1140/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 8://阅读 loopWidgetArr[i]->setGeometry((float)1300/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 9://记事本 loopWidgetArr[i]->setGeometry((float)1455/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 10://相机 loopWidgetArr[i]->setGeometry((float)1625/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 11://LED loopWidgetArr[i]->setGeometry((float)1780/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 12://图片浏览器 loopWidgetArr[i]->setGeometry((float)1940/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 13://日历 loopWidgetArr[i]->setGeometry((float)2100/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 14://录音 loopWidgetArr[i]->setGeometry((float)2255/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 15://温度 loopWidgetArr[i]->setGeometry((float)2425/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; case 16://脚本测试 loopWidgetArr[i]->setGeometry((float)2580/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)120/800*this->geometry().width(),(float)170/480*this->geometry().height()); break; default: break; } iconPushButton[i] = new QPushButton(loopWidgetArr[i]); iconPushButton[i]->setGeometry((float)15/800*this->geometry().width(),(float)0/480*this->geometry().height(), (float)90/800*this->geometry().width(),(float)90/800*this->geometry().width()); // loopWidgetArr[i]->setStyleSheet("QWidget{background-color:rgba(80,80,80,0%);" // "border-radius: 5px;border-image:transparent}"); iconPushButton[i]->setStyleSheet("border-image:url(:/icon/"+QString::number(i)+".png);background-color:transparent;outline:none;border-radius:8px;"); loopWidgetArr[i]->setStyleSheet("border-image:transparent;background-color:transparent;outline:none"); iconPushButton[i]->installEventFilter(this); // 安装事件过滤器 appNameLabel[i] = new QLabel(loopWidgetArr[i]); appNameLabel[i]->setGeometry(0,(float)105/480*this->geometry().height(),loopWidgetArr[i]->geometry().width(),(float)25/480*this->geometry().height()); appNameLabel[i]->setText(strList[i]); appNameLabel[i]->setAlignment(Qt::AlignCenter); appNameLabel[i]->setFont(font); appNameLabel[i]->setStyleSheet("color:rgba(255,255,255,80%);border-image:transparent;background-color:transparent;outline:none"); } for(int i = 0; i < 4; i++){ pageWidget[i] = new QWidget(mainWidget); if(i==0) pageWidget[i]->setStyleSheet("border-image:url(:/icon/page2.png)"); else pageWidget[i]->setStyleSheet("border-image:url(:/icon/page1.png)"); } pageWidget[0]->setGeometry((float)330/800*this->geometry().width(),(float)415/480*this->geometry().height(), (float)15/800*this->geometry().width(),(float)15/800*this->geometry().width()); pageWidget[1]->setGeometry((float)370/800*this->geometry().width(),(float)415/480*this->geometry().height(), (float)15/800*this->geometry().width(),(float)15/800*this->geometry().width()); pageWidget[2]->setGeometry((float)410/800*this->geometry().width(),(float)415/480*this->geometry().height(), (float)15/800*this->geometry().width(),(float)15/800*this->geometry().width()); pageWidget[3]->setGeometry((float)450/800*this->geometry().width(),(float)415/480*this->geometry().height(), (float)15/800*this->geometry().width(),(float)15/800*this->geometry().width()); appMainInterface = new QLabel(this); font.setPixelSize((float)15/800*this->geometry().width()); appMainInterface->setGeometry((float)0/800*this->geometry().width(),(float)5/480*this->geometry().height(), (float)150/800*this->geometry().width(),(float)25/480*this->geometry().height()); appMainInterface->setText("这是一个滑动测试"); appMainInterface->setFont(font); appMainInterface->setStyleSheet("color:white"); appMainInterface->setAlignment(Qt::AlignCenter); appPathStrList<<"../QMusicPlayer/QMusicPlayer" <<"../QMediaPlayer/QMediaPlayer" <<"../QWebBrowser/QWebBrowser" <<"../QOnlineWeather/QOnlineWeather" <<"../QClock/QClock" <<"../QFileView/QFileView" <<"../QPictureViewer/QPictureViewer" <<"../QCalculator/QCalculator" <<"../QReader/QReader" <<"../QNotepad/QNotepad" <<"../QCamera/QCamera" <<"../QLed/QLed" <<"../QImageViewer/QImageViewer" <<"../QCalendar/QCalendar" <<"../QRecorder/QRecorder" <<"../QTemperature/QTemperature" <<"../QAutotest/QAutotest"; appExecTimer = new QTimer(this); connect(appExecTimer,SIGNAL(timeout()),this,SLOT(slotappExecTimertimeout())); /* 消息提示,判断当前目录下是否有这个app */ messageLabel = new QLabel(this); messageLabel->setGeometry((float)350/800*this->geometry().width(),(float)190/480*this->geometry().height(), (float)100/800*this->geometry().width(),(float)100/800*this->geometry().width()); messageLabel->setStyleSheet("QLabel{border-radius: 5px;background-color:rgba(200,200,200,80%);color:white}"); messageLabel->setText("该功能暂未上线\n努力优化中..."); messageLabel->setAlignment(Qt::AlignCenter); font.setPixelSize((float)13/800*this->geometry().width()); messageLabel->setFont(font); messageLabel->hide(); rightWidget = new QWidget(this); rightWidget->setGeometry((float)200/800*this->geometry().width(),(float)220/480*this->geometry().height(), (float)400/800*this->geometry().width(),(float)110/480*this->geometry().height()); rightWidget->setStyleSheet("border-image:transparent;background-color:rgba(40,40,40,50%);border-radius: 20px;"); rightWidget->hide(); } void MainWindow::animationInit() { /* 绑定动画对象 */ propertyAnimation = new QPropertyAnimation(appWidget, "pos"); propertyAnimation->setDuration(200);//动画长度是0.4s } void MainWindow::forward() { //qDebug()<<"forward"<start(200); // 滑动期间200ms内,不进入程序 static int widthValue = appWidgetParent->geometry().width(); propertyAnimation->stop(); propertyAnimation->setStartValue(QPoint(appWidget->pos().x(),0)); switch (loopCount) { case 0: propertyAnimation->setEndValue(QPoint(-widthValue*1,0)); break; case 1: propertyAnimation->setEndValue(QPoint(-widthValue*2,0)); break; case 2: propertyAnimation->setEndValue(QPoint(-widthValue*3,0)); break; default: propertyAnimation->setEndValue(QPoint(-widthValue*3,0)); break; } propertyAnimation->start(); loopCount++; if(loopCount >= 3) loopCount=3; for(int i=0;i<4;i++){ if(i==qAbs(loopCount)) pageWidget[i]->setStyleSheet("border-image:url(:/icon/page2.png)"); else pageWidget[i]->setStyleSheet("border-image:url(:/icon/page1.png)"); } } void MainWindow::backward() { //qDebug()<<"backward"<start(200); // 滑动期间200ms内,不进入程序 propertyAnimation->stop(); propertyAnimation->setStartValue(QPoint(appWidget->pos().x(),0)); static int widthValue = appWidgetParent->geometry().width(); switch (loopCount) { case 1: propertyAnimation->setEndValue(QPoint(0,0)); break; case 2: propertyAnimation->setEndValue(QPoint(-widthValue,0)); break; case 3: propertyAnimation->setEndValue(QPoint(-widthValue*2,0)); break; default: propertyAnimation->setEndValue(QPoint(0,0)); break; } propertyAnimation->start(); loopCount--; if(loopCount <= 0) loopCount=0; for(int i=0;i<4;i++){ if(i==qAbs(loopCount)) pageWidget[i]->setStyleSheet("border-image:url(:/icon/page2.png)"); else pageWidget[i]->setStyleSheet("border-image:url(:/icon/page1.png)"); } } bool MainWindow::eventFilter(QObject *watched, QEvent *event) { static QGraphicsOpacityEffect *opacityEffect = new QGraphicsOpacityEffect(); // 设置图标的不透明度 static QPoint point; static QPoint point2; if(/*watched == mainWidget||*/watched == appWidget){ switch (event->type()) { case QEvent::MouseButtonPress: // qDebug()<setVisible(false); messageLabel->setVisible(false); break; case QEvent::MouseButtonRelease: { appExecTimer->start(200); // 200ms后scrollingFlag为false,这里很重要! //qDebug()<geometry().width(); if(qAbs(offsetx) >= 50 && flagAppExec == true){ // 绝对值,求滑动的距离,退出程序1s内禁止滑动 if(offsetx > 0) backward(); // 向后滚动 else forward(); // 向前滚动 }else{ propertyAnimation->stop(); propertyAnimation->setStartValue(QPoint(appWidget->pos().x(),0)); propertyAnimation->setEndValue(QPoint(-position,0)); propertyAnimation->start(); } } break; case QEvent::MouseMove: { int moveOffset = cursor().pos().x() - point2.x(); appWidget->move(appWidget->pos().x()+moveOffset,0); point2.setX(cursor().pos().x()); appExecTimer->stop(); scrollingFlag = true; } break; default: break; } } for(int i = 0; i < 17; i++){ if(watched == iconPushButton[i]){ switch (event->type()) { case QEvent::MouseButtonPress: loopWidgetArr[i]->setGraphicsEffect(opacityEffect); opacityEffect->setOpacity(0.8); // 按下图标80%透明 point.setX(cursor().pos().x()); // 记录按下点的x1坐标 point2.setX(cursor().pos().x()); // 记录按下点的x2坐标 break; case QEvent::Leave: opacityEffect->setOpacity(1); // 鼠标离开后图标为完全不透明 break; case QEvent::MouseButtonRelease: appExecTimer->start(200); // 200ms后scrollingFlag为false,这里很重要! opacityEffect->setOpacity(1); // 松开鼠标后为完全不透明 if( flagAppExec == true && scrollingFlag == false){//判断屏幕是否在滚动,及退出程序1s内不允许进入 QFile file(appPathStrList[i]); if (!file.exists()){ // 判断路径下有没有app程序 messageLabel->setVisible(true); // 没有就提示这个app暂时没上线 appExecTimer->start(1000); }else{ /* 如果正在屏幕还在滚动,那么也不进入程序 */ if(propertyAnimation->state() != QPropertyAnimation::Stopped) return true; this->hide(); flagAppExec = false; // 程序进入标志位 QProcess appProcess; appProcess.setParent(this); appProcess.start(appPathStrList[i]); appProcess.waitForFinished(-1); appExecTimer->start(1000); // 程序退出1s后,过滤掉阻塞掉的点击事件,防止再次进入 QCursor cursor; cursor.setPos(this->geometry().width(),this->geometry().height()); this->show(); } } { int offsetx = cursor().pos().x() - point.x(); //qDebug()<geometry().width(); if(qAbs(offsetx) >= 50 && flagAppExec == true){ // 绝对值,求滑动的距离,判断程序退出1s内标志位 if(offsetx > 0) backward(); // 向后滚动 else forward(); // 向前滚动 }else{ propertyAnimation->stop(); propertyAnimation->setStartValue(QPoint(appWidget->pos().x(),0)); propertyAnimation->setEndValue(QPoint(-position,0)); propertyAnimation->start(); } } break; case QEvent::MouseMove: { int moveOffset = cursor().pos().x() - point2.x(); appWidget->move(appWidget->pos().x()+moveOffset,0); point2.setX(cursor().pos().x()); appExecTimer->stop(); scrollingFlag = true;//屏幕在滚动!标志位 } break; default: break; } } } // if(watched == mainWidget){ // switch (event->type()) { // case QEvent::MouseButtonPress: // rightWidget->setVisible(false); // messageLabel->setVisible(false); // break; // default: // break; // } // } // if (watched == weatherIcon){ // switch (event->type()) { // case QEvent::Enter: // weatherIcon->setToolTip("点我刷新天气"); // break; // case QEvent::MouseButtonPress: // updateWeather(); // 点击后更新天气 // break; // default: // break; // } // } // //音乐旋转控制代码 // if(watched == musicImage && event->type() == QEvent::Paint) // painter(); return QWidget::eventFilter(watched,event);//将事件传递给父类 } void MainWindow::slotappExecTimertimeout() { flagAppExec = true; scrollingFlag = false; appExecTimer->stop(); messageLabel->hide();/*提示app上暂时没上线1s后关闭*/ } MainWindow::~MainWindow() { delete ui; }