Преглед на файлове

V0.10.1
1、完成了时间选择器的修改

Apple преди 3 седмици
родител
ревизия
fe9363ccda

+ 11 - 2
demo/Component/SelectTime/SelectTime/Res/light/timepopupwidget.qss

@@ -1,4 +1,13 @@
 
+/* 
+QWidget
+{
+    border-radius: 0px;
+    background: #FFFFFF;
+} */
+
+
+
 /* ==========================================================
  *  QPushButton
  * ========================================================== */
@@ -14,14 +23,14 @@ QPushButton
 /********* 普通椭圆按钮三种状态效果 *********/
 QPushButton#pBtn_Cancel
 {
-    background: transparent;
+    background: "#FFFFFF";
     color: #3A3F63;
 	border: 1px solid #E6E9F4;
 	border-radius: 4px;
 }
 QPushButton#pBtn_Cancel:hover
 {
-    background: transparent;
+    background: "#FFFFFF";
 	color: #4458FE;
 	border: 1px solid #4458FE;
     border-radius: 4px;

+ 6 - 7
demo/Component/SelectTime/SelectTime/timepopupwidget.cpp

@@ -80,7 +80,6 @@ void TimePopupWidget::Reset()
 /* 设置时间 */
 void TimePopupWidget::setTime(const QDateTime& time)
 {
-    m_formerDateTime = time;
     m_currentDateTime = time;
     ui->widget_Hour->SetTime(time);
     ui->widget_Minute->SetTime(time);
@@ -154,7 +153,7 @@ void TimePopupWidget::do_listItemClicked(QListWidgetItem *item)
         // m_bTimeFlag = true;
         // ui->dateTimeEdit->setTime(t);
         m_currentDateTime.setTime(t);
-        emit signal_timeChanged(m_currentDateTime);
+        emit signal_timeChanged(m_currentDateTime.time());
     }
 }
 
@@ -162,16 +161,16 @@ void TimePopupWidget::do_listItemClicked(QListWidgetItem *item)
 /* 点击了确定按钮 */
 void TimePopupWidget::do_pBtn_Ok_Clicked()
 {
-    emit signal_timeChanged(m_currentDateTime);
-    emit signal_closePopup();
+    emit signal_timeChanged(m_currentDateTime.time());
+    emit signal_closePopup(true);
 }
 
 /* 点击了取消按钮 */
 void TimePopupWidget::do_pBtn_Cancel_Clicked()
 {
-    m_currentDateTime = m_formerDateTime;
-    emit signal_timeChanged(m_currentDateTime);
-    emit signal_closePopup();
+    // m_currentDateTime = m_formerDateTime;
+    // emit signal_timeChanged(m_currentDateTime.time());
+    emit signal_closePopup(false);
 }
 
 

+ 3 - 3
demo/Component/SelectTime/SelectTime/timepopupwidget.h

@@ -29,9 +29,9 @@ public:
     void setTime(const QDateTime& time);
 
 signals:
-    void signal_timeChanged(const QDateTime& dt);
+    void signal_timeChanged(const QTime& dt);
     /* 点击了确定或取消按钮,关闭弹窗 */
-    void signal_closePopup();
+    void signal_closePopup(bool isOk);
 
 private:
     /* 设置QSS */
@@ -49,7 +49,7 @@ private slots:
 private:
     Ui::TimePopupWidget *ui;
     QDateTime m_currentDateTime;
-    QDateTime m_formerDateTime;
+    // QDateTime m_formerDateTime;
 };
 
 #endif // TIMEPOPUPWIDGET_H

+ 2 - 2
demo/Component/SelectTime/SelectTime/timepopupwidget.ui

@@ -107,7 +107,7 @@
         <property name="minimumSize">
          <size>
           <width>52</width>
-          <height>24</height>
+          <height>26</height>
          </size>
         </property>
         <property name="text">
@@ -126,7 +126,7 @@
         <property name="minimumSize">
          <size>
           <width>52</width>
-          <height>24</height>
+          <height>26</height>
          </size>
         </property>
         <property name="text">

+ 84 - 155
demo/Component/SelectTime/SelectTime/timewidget.cpp

@@ -39,34 +39,6 @@ TimeWidget::~TimeWidget()
     delete ui;
 }
 
-// void TimeWidget::CreateTimeVector(const QVector<int> &types)
-// {
-    // ClearVector(m_vecTimePart);
-    // for (auto& type : types) 
-    // {
-    //     TimePartWidget::emSection emType = static_cast<TimePartWidget::emSection>(type);
-    //     if (emType >= TimePartWidget::emSection::MAX_SECTION) {
-    //         continue;
-    //     }
-    //     TimePartWidget* pTmp = new TimePartWidget(this);
-    //     pTmp->Init(emType);
-    //     if (nullptr != pTmp) {
-    //         pTmp->SetMaxWidth(width() / types.count());
-    //         m_vecTimePart.append(pTmp);
-    //     }
-    // }
-// }
-
-// void TimeWidget::ClearVector(QVector<TimePartWidget *> &vec)
-// {
-//     for (auto& pWdg : vec) {
-//         if (nullptr != pWdg) {
-//             delete pWdg;
-//             pWdg = nullptr;
-//         }
-//     }
-//     vec.clear();
-// }
 
 void TimeWidget::SetMainWindow(QWidget* pWidget)
 {
@@ -102,10 +74,10 @@ QTime TimeWidget::getTime()
  * @brief 存在返回时间,否则返回00:00:00
  * @return
  */
-QTime TimeWidget::getFormTime() const
-{
-    return ui->dateTimeEdit->isHidden() ? QTime(0, 0, 0) : ui->dateTimeEdit->time();
-}
+// QTime TimeWidget::getFormTime() const
+// {
+//     return ui->dateTimeEdit->isHidden() ? QTime(0, 0, 0) : ui->dateTimeEdit->time();
+// }
 
 // void TimeWidget::setTime(const QString& t)
 // {
@@ -122,6 +94,7 @@ void TimeWidget::setTime(const QTime& t)
     ui->lbl_tip->hide();
     ui->dateTimeEdit->show();
     UpdatePopupTime(ui->dateTimeEdit->dateTime());
+    m_formerDateTime.setTime(t);
 }
 
 void TimeWidget::clearTime()
@@ -136,26 +109,26 @@ QString TimeWidget::tipText() const
     return ui->lbl_tip->text();
 }
 /* 设置时间选择区域的大小,不能超过时间编辑栏的大小,这个主要是防止时间栏太宽,影响美观 */
-void TimeWidget::setTimeAreaWidth(int w)
-{
-    if(w < 0)
-    {
-        m_width = 0;
-    }
-    else if(w > this->width())
-    {
-        m_width = this->width();
-    }
-    else
-    {
-        m_width = w;
-    }
-}
+// void TimeWidget::setTimeAreaWidth(int w)
+// {
+//     if(w < 0)
+//     {
+//         m_width = 0;
+//     }
+//     else if(w > this->width())
+//     {
+//         m_width = this->width();
+//     }
+//     else
+//     {
+//         m_width = w;
+//     }
+// }
 
 void TimeWidget::showTimeEditArea()
 {
     this->show();
-    ShowTimeArea(true);
+    ShowPopupArea(true);
 }
 
 /* 以弹窗的模式模态显示 */
@@ -164,7 +137,7 @@ void TimeWidget::execShow()
     QEventLoop loop;
     connect (this, &TimeWidget::signal_close, &loop, &QEventLoop::quit);
     this->show();
-    ShowTimeArea(true);
+    ShowPopupArea(true);
     loop.exec();
 
     deleteLater();
@@ -199,28 +172,6 @@ void TimeWidget::setIconSize(int w, int h)
     // ui->btn_tip->resize(w, h);
 }
 
-/* 设置默认的样式 */
-void TimeWidget::setDefaultStyle()
-{
-    /* 判断显示类型,如果是弹窗直接显示编辑区 */
-    if(m_type == Dialog)
-    {
-        ui->btn_tip->hide();
-        this->resize(136,36);
-//        ShowTimeArea(false);
-        /* 设置编辑栏样式 */
-        // this->setStyleSheet(R"(
-        //     TimeWidget
-        //     {
-        //         padding-left:15px;
-        //         background: #FFFFFF;
-        //         border-radius: 4px;
-        //         border: 1px solid #E6E9F4;
-        //     }
-        // )");
-    }
-}
-
 /* 设置编辑栏大小 */
 void TimeWidget::setEditLine(int w, int h)
 {
@@ -257,29 +208,20 @@ void TimeWidget::setQSS()
     }
 }
 
-/**
- * @brief 点击提示信息
- */
-void TimeWidget::onBtnTipClicked()
+
+/* 点击了时间图标 */
+void TimeWidget::do_pBtn_tip_Clicked()
 {
-    bool isSelected = ui->btn_tip->property("selected").toBool();
-    if (!isSelected) {
-        // 显示日期
-        ui->lbl_tip->hide();
-        ui->dateTimeEdit->show();
-        ShowTimeArea(true);
-    } else {
-        if(m_isDisableClear) { return; } // 如果禁止清除时间,就不执行清除操作
-        // 清除时间
-        ui->dateTimeEdit->setTime(QTime(0, 0, 0));
-        UpdateProperty(ui->btn_tip, "selected", false);
-        QDateTime dt;
-        dt.setTime(QTime(0, 0, 0));
-        UpdatePopupTime(dt);
-        ShowTimeArea(false);
-        ui->dateTimeEdit->hide();
-        ui->lbl_tip->show();
+    if(m_pTimePopupWidget == nullptr)
+    {
+        return;
     }
+    if(m_pTimePopupWidget->isVisible())
+    {
+        return;
+    }
+    /* 展示弹窗 */
+    showTimeEditArea();
 }
 
 /**
@@ -303,27 +245,33 @@ bool TimeWidget::eventFilter(QObject* obj, QEvent* e)
             if(m_isBanPopupShow == true)
             {
                 m_isBanPopupShow = false;
+                /* 这里需要再次失去焦点,否则下次点击编辑栏无法弹出Popup */
+                ui->dateTimeEdit->clearFocus();
                 return QWidget::eventFilter(obj, e);
             }
             //qInfo() << "dateTimeEdit focusIn";
-            ShowTimeArea(true);
+            ShowPopupArea(true);
             UpdateProperty(ui->btn_tip, "selected", true);
-            emit signal_formerTimer(ui->dateTimeEdit->time());
+            // emit signal_formerTimer(ui->dateTimeEdit->time());
         }
         return QWidget::eventFilter(obj, e);
-    } else if (obj == ui->lbl_tip) 
+    } 
+    else if (obj == ui->lbl_tip) 
     {
         if (e->type() == QEvent::MouseButtonPress && m_type == EditLine)
         {
             //qInfo() << "mouseButtonPress";
             ui->dateTimeEdit->show();
             ui->lbl_tip->hide();
-            ShowTimeArea(true);
+            ShowPopupArea(true);
             //ui->dateTimeEdit->setFocus();//
             return QWidget::eventFilter(obj, e);
         }
-    } else if (obj == this) {
-        if (e->type() == QEvent::Enter) {
+    } 
+    else if (obj == this) 
+    {
+        if (e->type() == QEvent::Enter) 
+        {
             UpdateProperty(this, "hover", true);
         } else if (e->type() == QEvent::Leave &&
                    ((m_wdgTimeArea.isNull() && !ui->dateTimeEdit->hasFocus()) ||
@@ -342,16 +290,20 @@ bool TimeWidget::eventFilter(QObject* obj, QEvent* e)
             QRect rc(gtl.x(), gtl.y(), width(), height()); // 全局位置判断
             if (!rc.contains(pMouse->globalPos())) 
             {
-                if(m_wdgTimeArea != nullptr && !m_wdgTimeArea->isHidden())
+                if(m_wdgTimeArea == nullptr)
+                {
+                    return QWidget::eventFilter(obj, e);
+                }
+                /* Pupop不可见,直接返回 */
+                if(!m_wdgTimeArea->isVisible())
                 {
-                    m_isBanPopupShow = true;
+                    return QWidget::eventFilter(obj, e);
                 }
+                m_isBanPopupShow = true;
                 
-                ui->dateTimeEdit->clearFocus();
-                ShowTimeArea(false);
+                ShowPopupArea(false);
                 UpdateProperty(this, "hover", false);
-                /* 关闭显示,发送携带时间的信号 */
-                emit signal_nowTime(ui->dateTimeEdit->time());
+                
                 if(m_type == Dialog)
                 {
                     this->close();
@@ -375,46 +327,11 @@ void TimeWidget::moveEvent(QMoveEvent *event)
 //        qDebug() << "posX:" << pt.x() << "posY:" << pt.y();
     }
 }
-/**
- * @brief 时间列表选中事件
- * @param item
- */
-// void TimeWidget::onListItemClicked(QListWidgetItem *item)
-// {
-//     if (nullptr == item) return;
-//     TimePartWidget* pWdg = reinterpret_cast<TimePartWidget*>(QObject::sender());
-//     if (nullptr == pWdg) return;
-
-//     QString data(item->text());
-//     if (data.isEmpty()) return; // 过滤空白项
-//     QDateTime oldDt(ui->dateTimeEdit->dateTime());
-//     QTime t(ui->dateTimeEdit->time());
-//     switch (pWdg->GetType()) {
-//     case TimePartWidget::HOUR: {
-//         t.setHMS(data.toInt(), t.minute(), t.second());
-//         break;
-//     }
-//     case TimePartWidget::MINUTE: {
-//         t.setHMS(t.hour(), data.toInt(), t.second());
-//         break;
-//     }
-//     case TimePartWidget::SECOND: {
-//         t.setHMS(t.hour(), t.minute(), data.toInt());
-//         break;
-//     }
-//     default:
-//         break;
-//     }
-//     if (oldDt.time() != t) {
-//         m_bTimeFlag = true;
-//         ui->dateTimeEdit->setTime(t);
-//     }
-// }
-
 
-void TimeWidget::do_dateTimeChanged(const QDateTime& dt)
+/* 这个用来实时修改编辑栏的时间 */
+void TimeWidget::do_dateTimeChanged(const QTime& dt)
 {
-    ui->dateTimeEdit->setTime(dt.time());
+    ui->dateTimeEdit->setTime(dt);
 }
 
 
@@ -435,14 +352,15 @@ void TimeWidget::onDateTimeChanged(const QDateTime& dt)
 }
 
 /* 关闭Popup弹窗 */
-void TimeWidget::do_closePopup()
+void TimeWidget::do_closePopup(bool isOk)
 {
+    if(isOk == false)
+    {
+        ui->dateTimeEdit->setTime(m_formerDateTime.time());
+    }
     m_isBanPopupShow = true;
-    ui->dateTimeEdit->clearFocus();
-    ShowTimeArea(false);
+    ShowPopupArea(false);
     UpdateProperty(this, "hover", false);
-    /* 关闭显示,发送携带时间的信号 */
-    emit signal_nowTime(ui->dateTimeEdit->time());
     if(m_type == Dialog)
     {
         this->close();
@@ -494,7 +412,7 @@ void TimeWidget::UpdatePopupTime(const QDateTime& dt)
  * @brief wdgTimeArea区域是创建出来的,不属于ui区域,他的父类是m_pMainWindow,因此移动的时候需要使用m_pMainWindow的坐标
  * @param bShow
  */
-void TimeWidget::ShowTimeArea(bool bShow)
+void TimeWidget::ShowPopupArea(bool bShow)
 {
     if (m_wdgTimeArea.isNull()) 
     {
@@ -504,19 +422,30 @@ void TimeWidget::ShowTimeArea(bool bShow)
     {
         if (bShow) 
         {
-            //UpdatePopupTime(ui->dateTimeEdit->dateTime());
             // 重新定位再显示
             QPoint pt = this->mapTo(m_pMainWindow, QPoint(0, 0));
             m_wdgTimeArea->move(QPoint(pt.x() - SHADOW_MARGIN, pt.y() + this->height()));
-            /* 设置选择条的大小,如果没有设置m_width,就是用时间编辑栏的宽度 */
-            m_wdgTimeArea->resize((m_width == 0 ? width() : m_width) + 2 * SHADOW_MARGIN, TIME_AREA_HEIGHT * 6 + 2 * SHADOW_MARGIN);
-            m_wdgTimeArea->setMaximumWidth(width() + 2 * SHADOW_MARGIN);
-            m_wdgTimeArea->show();
+
+            /* 设置弹窗Popup的大小,使用默认的固定大小,不允许改变
+               关于高度:确定取消按钮所占的高度是固定的32,和一节大小一样,所以这里 */
+            int width = 2 * SHADOW_MARGIN + TIME_AREA_WIDTH * m_vecTimeSections.size();
+            int height = TIME_AREA_HEIGHT * 7 + 2 * SHADOW_MARGIN;
+            m_wdgTimeArea->resize(QSize(width, height));
             UpdatePopupTime(ui->dateTimeEdit->dateTime());
+            /* 保存现在的时间 */
+            m_formerDateTime = ui->dateTimeEdit->dateTime();
+            m_wdgTimeArea->show();
         } else 
         {
             m_wdgTimeArea->hide();
             emit signal_close();
+            /* 关闭显示,发送携带时间的信号,判断一下时间是否改变,不改变不发信号 */
+            if(m_formerDateTime.time() != ui->dateTimeEdit->time())
+            {
+                emit signal_timeChanged(m_formerDateTime.time(), ui->dateTimeEdit->time());
+            }
+            /* 让编辑栏失去焦点 */
+            ui->dateTimeEdit->clearFocus();
         }
     }
 }
@@ -584,8 +513,8 @@ void TimeWidget::Init()
     }
     ui->btn_tip->setProperty("selected", false);
 
-    connect(ui->btn_tip, &QPushButton::clicked, this, &TimeWidget::onBtnTipClicked);
+    connect(ui->btn_tip, &QPushButton::clicked, this, &TimeWidget::do_pBtn_tip_Clicked);
     connect(ui->dateTimeEdit, &QDateTimeEdit::dateTimeChanged, this, &TimeWidget::onDateTimeChanged);
 
-    setDefaultStyle();
+    // setDefaultStyle();
 }

+ 14 - 19
demo/Component/SelectTime/SelectTime/timewidget.h

@@ -13,6 +13,7 @@
  *  3、在原来的基础上新添加了两个信号,在关闭的时候发送
  *  4、使用Dialog模式的时候,点击空白处隐藏就会close掉,然后发送新的时间信号
  *  5、使用Dialog模式,执行execShow()函数,会阻塞运行,直到关闭
+ *  6、如果需要对比修改之前和之后的时间,需要使用Popup的方式修改时间,禁止在编辑栏直接修改
 */
 
 
@@ -43,19 +44,17 @@ public:
     explicit TimeWidget(ShowType type = EditLine);
     ~TimeWidget();
 
-    // void CreateTimeVector(const QVector<int>& types);
-    // void ClearVector(QVector<TimePartWidget*>& vec);
     // 在父窗口无法容纳控件时,这是必要的
     void SetMainWindow(QWidget* pWidget);
     QTime getTime();
     // QString getTimeStr();
-    QTime getFormTime() const;
+    // QTime getFormTime() const;
     // void setTime(const QString& t);
     void setTime(const QTime& t);
     void clearTime();
     QString tipText() const;
     /* 新增一个设置时间条宽度的函数 */
-    void setTimeAreaWidth(int w);
+    // void setTimeAreaWidth(int w);
     /***** 2024-05-25 添加两个信号 ******/
     void showTimeEditArea();
     /* 以弹窗的模式模态显示 */
@@ -66,20 +65,15 @@ public:
     void setIconShow(bool isShow);
     /* 设置图标大小 */
     void setIconSize(int w, int h);
-    /* 设置默认的样式 */
-    void setDefaultStyle();
     /* 设置编辑栏大小 */
     void setEditLine(int w, int h);
     /* 设置禁止使用滚轮修改时间 */
     void setWheelDisabled(bool disabled);
-    /* 禁止点击时间图标清空时间信息 */
-    void setDisableClear(bool disabled) { m_isDisableClear = disabled; }
 
     /* 设置QSS */
     void setQSS();
 signals:
-    void signal_nowTime(const QTime& time);
-    void signal_formerTimer(const QTime& time);
+    void signal_timeChanged(const QTime& formerTime, const QTime& nowTime);
     void signal_close();
 
 protected:
@@ -88,38 +82,39 @@ protected:
 
 
 private slots:
-    void onBtnTipClicked();
-    // void onListItemClicked(QListWidgetItem* item);
-    void do_dateTimeChanged(const QDateTime& dt);
+    /* 点击了时间图标 */
+    void do_pBtn_tip_Clicked();
+    /* 这个用来实时修改编辑栏的时间 */
+    void do_dateTimeChanged(const QTime& dt);
     void onDateTimeChanged(const QDateTime& dt);
     /* 关闭Popup弹窗 */
-    void do_closePopup();
+    void do_closePopup(bool isOk);
 private:
     void UpdateProperty(QObject* obj, const char* name, bool flag);
     void UpdatePopupTime(const QDateTime& dt);
-    void ShowTimeArea(bool bShow);
+    void ShowPopupArea(bool bShow);
     void CreatePopupWidget();
     /* 初始化函数 */
     void Init();
 private:
-    const int TIME_AREA_WIDTH = 56;
+    // const int TIME_AREA_WIDTH = 56;
+    const int TIME_AREA_WIDTH = 46;
     const int TIME_AREA_HEIGHT = 32;
     const int SHADOW_MARGIN = 9;    // 对应BlurRadius模糊半径16px
 
     Ui::TimeWidget *ui;
-    // QVector<TimePartWidget*> m_vecTimePart;
     TimePopupWidget* m_pTimePopupWidget = nullptr;
     QVector<int> m_vecTimeSections;
     bool m_bTimeFlag{false};                     // 时间更新标志
     QScopedPointer<ShadowWidget> m_wdgTimeArea;  // 时间选择窗口
     QWidget* m_pMainWindow;                      // 外层祖辈窗口,能容纳时间控件高度即可(默认父窗口)
     ShowType m_type;                            /* 显示类型 */
-    int m_width = 0;                            /* TimeArea宽度 */
+    // int m_width = 0;                            /* TimeArea宽度 */
 
     bool m_isDisableWheel = false;          // 禁用滚轮修改时间
-    bool m_isDisableClear = false;          // 禁用点击时间图标清空时间信息
     bool m_isBanPopupShow = false;             /* 禁止Popup显示,这个标志位用于关闭Popup弹窗时设置的,防止QEditLine获取焦点后再显示 */
 
+    QDateTime m_formerDateTime;                  /* 修改前的时间  */
 };
 
 #endif // TIMEWIDGET_H

+ 8 - 1
demo/Component/SelectTime/widget.cpp

@@ -6,6 +6,7 @@
 #include <stdlib.h>
 
 #include "spdlog/spdlog.h"
+#include "timewidget.h"
 
 
 Widget::Widget(QWidget *parent)
@@ -14,7 +15,7 @@ Widget::Widget(QWidget *parent)
 {
     ui->setupUi(this);
 
-    
+    connect(ui->timeEdit, &TimeWidget::signal_timeChanged, this, &Widget::do_timeEdit_timeChanged);
 
     SPDLOG_INFO("***** Qt Library *****");
 }
@@ -25,3 +26,9 @@ Widget::~Widget()
     delete ui;
 }
 
+/* 时间改变了 */
+void Widget::do_timeEdit_timeChanged(const QTime &formerTime, const QTime &time)
+{
+    SPDLOG_INFO("时间改变了: {} -> {}", formerTime.toString("HH:mm:ss").toStdString(), time.toString("HH:mm:ss").toStdString());
+}
+

+ 2 - 1
demo/Component/SelectTime/widget.h

@@ -18,7 +18,8 @@ public:
     ~Widget();
 
 private slots:
-
+    /* 时间改变了 */
+    void do_timeEdit_timeChanged(const QTime &formerTime, const QTime &time);
 
 private:
     Ui::Widget *ui;

+ 2 - 1
demo/DesignerPattern/widget.cpp

@@ -13,7 +13,6 @@ Widget::Widget(QWidget *parent)
     ui->setupUi(this);
 
 
-
     SPDLOG_INFO("✨✨✨✨✨ Qt Library ✨✨✨✨✨");
 }
 
@@ -29,3 +28,5 @@ Widget::~Widget()
 
 
 
+
+