diff --git a/Driver/BDTableView.qml b/Driver/BDTableView.qml index a4d37b9..bd4160c 100644 --- a/Driver/BDTableView.qml +++ b/Driver/BDTableView.qml @@ -5,6 +5,7 @@ import QtQuick.Controls.Styles 1.2 TableView { id:roowView property var comList: [1,2,3,4,5,6,7] + property int scrollbarWidth : 10 itemDelegate: Item { function isCheckColumn( columnIndex ) { @@ -23,6 +24,23 @@ TableView { anchors.centerIn: parent checked: styleData.value visible: isCheckColumn( styleData.column ) + style: CheckBoxStyle { + indicator: Rectangle { + implicitWidth: 14 + implicitHeight: 14 + radius: 2 + border.color: control.activeFocus ? "darkblue" : "gray" + border.width: 1 + Rectangle { + visible: control.checked + color: "#555" + border.color: "#333" + radius: 1 + anchors.margins: 2 + anchors.fill: parent + } + } + } } ComboBox { @@ -64,6 +82,62 @@ TableView { border.width: 1 border.color:"grey" } + style : ScrollViewStyle{ + scrollBarBackground : Item { + implicitWidth: roowView.scrollbarWidth + implicitHeight: roowView.scrollbarWidth + visible : true + Rectangle { + anchors.fill: parent + color: "transparent" + border.color: "transparent" + anchors.rightMargin: styleData.horizontal ? -2 : -1 + anchors.leftMargin: styleData.horizontal ? -2 : 0 + anchors.topMargin: styleData.horizontal ? 0 : -2 + anchors.bottomMargin: styleData.horizontal ? -1 : -2 + } + + } + handle: Rectangle{ + id : theRect + opacity: 0.8 + implicitWidth: styleData.horizontal ? 66 : roowView.scrollbarWidth + implicitHeight: styleData.horizontal ? roowView.scrollbarWidth : 66 + color : "#232323" + radius : roowView.scrollbarWidth + border.width: 1 + border.color: "#333333" + states: [ + State { + name: "clicked" + when : styleData.pressed + PropertyChanges {target: theRect; opacity : 1} + }, + State{ + name: "hovered" + when : styleData.hovered + PropertyChanges {target: theRect; opacity : 0.6} + } + + ] + transitions: Transition { + PropertyAnimation { properties: "opacity"; easing.type: Easing.InOutQuad; duration: 500 } + } + } + incrementControl: Rectangle { + visible : false + implicitWidth: 0 + implicitHeight: 0 + color : "blue" + } + decrementControl: Rectangle { + visible : false + implicitWidth: 0 + implicitHeight: 40 + color : "blue" + } + corner: Rectangle { color: "transparent";visible : false } + } TableViewColumn { id:checkedColumn diff --git a/Driver/DDDriverView.qml b/Driver/DDDriverView.qml index 2192ba5..f471b4a 100644 --- a/Driver/DDDriverView.qml +++ b/Driver/DDDriverView.qml @@ -5,7 +5,7 @@ import "../ddui" as DDui DDui.DDAbstractView { id:driverUi visible: true - width: 816 + width: 860 height: 600 DDui.DDuiShadowBg{ id:bg diff --git a/Driver/DDTabView.qml b/Driver/DDTabView.qml index 241be81..2d1e31f 100644 --- a/Driver/DDTabView.qml +++ b/Driver/DDTabView.qml @@ -5,6 +5,8 @@ import "../XunLei/" as XunLei import "../youzan/" as YouZan import "../360/" as View360 import "../QQ/" as QQ +import "../matrix" as Matrix +import "../poetry" as Poetry TabView { id: tabView @@ -46,6 +48,19 @@ TabView { anchors.fill: parent } } + Tab { + title: "Matrix" + Matrix.MatrixItem{ + anchors.fill: parent + textColor:"#a10919" + } + } + Tab { + title: "Poetry" + Poetry.DDPoeComing{ + anchors.fill: parent + } + } style: TabViewStyle { property color frameColor: "#999" property color fillColor: "#eee" diff --git a/DriverQtVersion.pro b/DriverQtVersion.pro index 7d73565..b8fb515 100644 --- a/DriverQtVersion.pro +++ b/DriverQtVersion.pro @@ -7,7 +7,9 @@ SOURCES += main.cpp \ ddui/ddquickview.cpp \ youzan/youzanapi.cpp \ youzan/youzanobject.cpp \ - model/bdtablemodel.cpp + model/bdtablemodel.cpp \ + ddui/ddframeless_helper.cpp \ + ddui/ddnewquickwindow.cpp RESOURCES += qml.qrc imgqrc.qrc @@ -31,4 +33,6 @@ HEADERS += \ ddui/ddquickview.h \ youzan/youzanapi.h \ youzan/youzanobject.h \ - model/bdtablemodel.h + model/bdtablemodel.h \ + ddui/ddframeless_helper.h \ + ddui/ddnewquickwindow.h diff --git a/READMe.md b/READMe.md index e5a4ddf..e38c627 100644 --- a/READMe.md +++ b/READMe.md @@ -1,10 +1,10 @@ -# (20170330持续更新)基于QtQuick2.0开发的诸多漂亮的界面例子(作为入门首选) - -![驱动精灵主界面](http://7qn7mv.com1.z0.glb.clouddn.com/qtquickdriver.png) -![迅雷在线皮肤设置](http://7qn7mv.com1.z0.glb.clouddn.com/qtquickxl.png) -![迅雷本地皮肤设置](http://7qn7mv.com1.z0.glb.clouddn.com/qtquicklocal.png) -![有赞商城商品UI](http://7qn7mv.com1.z0.glb.clouddn.com/youzan-new.png) -![360安全卫士](http://7qn7mv.com1.z0.glb.clouddn.com/360.png) +# (20180408持续更新)基于QtQuick2.0开发的诸多漂亮的界面例子(作为入门首选) +![数字雨](images/matrix.png) +![驱动精灵主界面](http://qiniu.heilqt.com/qtquickdriver.png) +![迅雷在线皮肤设置](http://qiniu.heilqt.com/qtquickxl.png) +![迅雷本地皮肤设置](http://qiniu.heilqt.com/qtquicklocal.png) +![有赞商城商品UI](http://qiniu.heilqt.com/youzan-new.png) +![360安全卫士](http://qiniu.heilqt.com/360.png) ## 客户端 ### 使用QtQuick技术开发酷炫的客户端 @@ -15,7 +15,7 @@ * 模仿迅雷设置皮肤界面(待完善) * 支持窗口拉伸且可以设置停靠属性 * 新增QML与C++交换的接口 -* 新增有赞商城API接口和界面 +* 新增有赞商城API接口和界面 (需要自己申请有赞api的key等) * 新增自定义日历选择功能 * 新增打印有赞商城订单功能 * 刷新订单功能 @@ -23,6 +23,7 @@ * 新增360安全界面模仿 * 集成各个页面 * 加入系统托盘功能 +* 新增数字雨效果 ## 憧憬 diff --git a/ZB2129102102910290.png b/ZB2129102102910290.png new file mode 100644 index 0000000..9d12dd0 Binary files /dev/null and b/ZB2129102102910290.png differ diff --git a/ddui/DDHomeButton.qml b/ddui/DDHomeButton.qml index 96cf8b0..c4c0db5 100644 --- a/ddui/DDHomeButton.qml +++ b/ddui/DDHomeButton.qml @@ -1,4 +1,4 @@ -import QtQuick 2.0 +import QtQuick 2.0 import QtQuick.Controls 1.2 import QtQuick.Controls.Styles 1.2 @@ -7,7 +7,7 @@ Rectangle { width: 100 height: 100 color: "transparent" - property url btnUrl: "http://download.easyicon.net/png/1194626/72/" + property url btnUrl: "http://www.easyicon.net/download/png/1194626/72/" property string btnTxt: "Home" property bool systemBtn: false signal signalBtnClicked(string btn); @@ -51,6 +51,6 @@ Rectangle { horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter color: "white" - font.pixelSize: 18 + font.pixelSize: 14 } } diff --git a/ddui/DDTopBar.qml b/ddui/DDTopBar.qml index b0b2c02..2ded7a5 100644 --- a/ddui/DDTopBar.qml +++ b/ddui/DDTopBar.qml @@ -60,6 +60,24 @@ Rectangle { signalTopBtnClicked(5) } } + DDHomeButton{ + id:homeBtn7 + height: parent.height + btnUrl: "http://download.easyicon.net/png/42882/72/" + btnTxt: "数字雨" + onSignalBtnClicked: { + signalTopBtnClicked(6) + } + } + DDHomeButton{ + id:homeBtn8 + height: parent.height + btnUrl: "http://download.easyicon.net/png/1150085/72/" + btnTxt: "诗词歌赋" + onSignalBtnClicked: { + signalTopBtnClicked(7) + } + } } DDCloseButton{ id:close diff --git a/ddui/ddframeless_helper.cpp b/ddui/ddframeless_helper.cpp new file mode 100644 index 0000000..c4bea3d --- /dev/null +++ b/ddui/ddframeless_helper.cpp @@ -0,0 +1,902 @@ +#include +#include +#include +#include +#include +#include "ddframeless_helper.h" + +class WidgetData; +class WindowData; + +/**********CursorPosCalculator**********/ +class CursorPosCalculator +{ +public: + CursorPosCalculator(); + void reset(); + void recalculate(const QPoint &globalMousePos, const QRect &frameRect); + +public: + uint onEdges : 1; + uint onLeftEdge : 1; + uint onRightEdge : 1; + uint onTopEdge : 1; + uint onBottomEdge : 1; + uint onTopLeftEdge : 1; + uint onBottomLeftEdge : 1; + uint onTopRightEdge : 1; + uint onBottomRightEdge : 1; + + static int m_nBorderWidth; + static int m_nTitleHeight; +}; + +int CursorPosCalculator::m_nBorderWidth = 5; +int CursorPosCalculator::m_nTitleHeight = 30; + +/**********DDDDFramelessHelperPrivate**********/ +class DDFramelessHelperPrivate +{ +public: + QHash m_widgetDataHash; + QHash m_windowDataHash; + + bool m_bWidgetMovable : true; + bool m_bWidgetResizable : true; + bool m_bRubberBandOnResize : true; + bool m_bRubberBandOnMove : true; +}; + +/**********WidgetData**********/ +class WidgetData +{ +public: + WidgetData(DDFramelessHelperPrivate *d, QWidget *pTopLevelWidget); + + ~WidgetData(); + QWidget* widget(); + void handleWidgetEvent(QEvent *event); + void updateRubberBandStatus(void); + +private: + void updateCursorShape(const QPoint &gMousePos); + void resizeWidget(const QPoint &gMousePos); + void moveWidget(const QPoint &gMousePos); + void handleMousePressEvent(QMouseEvent *event); + void handleMouseReleaseEvent(QMouseEvent *event); + void handleMouseMoveEvent(QMouseEvent *event); + void handleLeaveEvent(QEvent *event); + void handleHoverMoveEvent(QHoverEvent *event); + +private: + DDFramelessHelperPrivate *d; + QRubberBand *m_pRubberBand; + QWidget *m_pWidget; + + QPoint m_ptDragPos; + CursorPosCalculator m_pressedMousePos; + CursorPosCalculator m_moveMousePos; + bool m_bLeftButtonPressed; + bool m_bCursorShapeChanged; + bool m_bLeftButtonTitlePressed; + Qt::WindowFlags m_windowFlags; +}; + +/**********WindowData**********/ +class WindowData +{ +public: + WindowData(DDFramelessHelperPrivate *d, QWindow *pTopLevelWidget); + + ~WindowData(); + QWindow* window(); + void handleWidgetEvent(QEvent *event); + void updateRubberBandStatus(void); + +private: + void updateCursorShape(const QPoint &gMousePos); + void resizeWidget(const QPoint &gMousePos); + void moveWidget(const QPoint &gMousePos); + void handleMousePressEvent(QMouseEvent *event); + void handleMouseReleaseEvent(QMouseEvent *event); + void handleMouseMoveEvent(QMouseEvent *event); + void handleLeaveEvent(QEvent *event); + void handleHoverMoveEvent(QHoverEvent *event); + + void handleDoubleClick(QMouseEvent *event); +private: + DDFramelessHelperPrivate *d; + QRubberBand *m_pRubberBand; + QWindow *m_pWindow; + + QPoint m_ptDragPos; + CursorPosCalculator m_pressedMousePos; + CursorPosCalculator m_moveMousePos; + bool m_bLeftButtonPressed; + bool m_bCursorShapeChanged; + bool m_bLeftButtonTitlePressed; + Qt::WindowFlags m_windowFlags; +}; +/**********CursorPosCalculator**********/ +CursorPosCalculator::CursorPosCalculator() +{ + reset(); +} + +void CursorPosCalculator::reset() +{ + onEdges = 0; + onLeftEdge = 0; + onRightEdge = 0; + onTopEdge = 0; + onBottomEdge = 0; + onTopLeftEdge = 0; + onBottomLeftEdge = 0; + onTopRightEdge = 0; + onBottomRightEdge = 0; +} + +void CursorPosCalculator::recalculate(const QPoint& gMousePos, const QRect& frameRect) +{ + int globalMouseX = gMousePos.x(); + int globalMouseY = gMousePos.y(); + + int frameX = frameRect.x(); + int frameY = frameRect.y(); + + int frameWidth = frameRect.width(); + int frameHeight = frameRect.height(); + + onLeftEdge = (globalMouseX >= frameX && + globalMouseX <= frameX + m_nBorderWidth ); + + + onRightEdge = (globalMouseX >= frameX + frameWidth - m_nBorderWidth && + globalMouseX <= frameX + frameWidth); + + onTopEdge = (globalMouseY >= frameY && + globalMouseY <= frameY + m_nBorderWidth ); + + onBottomEdge = (globalMouseY >= frameY + frameHeight - m_nBorderWidth && + globalMouseY <= frameY + frameHeight); + + onTopLeftEdge = onTopEdge && onLeftEdge; + onBottomLeftEdge = onBottomEdge && onLeftEdge; + onTopRightEdge = onTopEdge && onRightEdge; + onBottomRightEdge = onBottomEdge && onRightEdge; + + onEdges = onLeftEdge || onRightEdge || onTopEdge || onBottomEdge; +} + +/**********WidgetData**********/ +WidgetData::WidgetData(DDFramelessHelperPrivate *_d, QWidget *pTopLevelWidget) +{ + d = _d; + m_pWidget = pTopLevelWidget; + m_bLeftButtonPressed = false; + m_bCursorShapeChanged = false; + m_bLeftButtonTitlePressed = false; + m_pRubberBand = NULL; + + m_windowFlags = m_pWidget->windowFlags(); + m_pWidget->setMouseTracking(true); + m_pWidget->setAttribute(Qt::WA_Hover, true); + + updateRubberBandStatus(); +} +WidgetData::~WidgetData() +{ + if(m_pWidget){ + m_pWidget->setMouseTracking(false); + m_pWidget->setWindowFlags(m_windowFlags); + m_pWidget->setAttribute(Qt::WA_Hover, false); + } + delete m_pRubberBand; + m_pRubberBand = NULL; +} + +QWidget* WidgetData::widget() +{ + return m_pWidget; +} + +void WidgetData::handleWidgetEvent(QEvent *event) +{ + switch (event->type()) + { + default: + break; + case QEvent::MouseButtonPress: + handleMousePressEvent(static_cast(event)); + break; + case QEvent::MouseButtonRelease: + handleMouseReleaseEvent(static_cast(event)); + break; + case QEvent::MouseMove: + handleMouseMoveEvent(static_cast(event)); + break; + case QEvent::Leave: + handleLeaveEvent(static_cast(event)); + break; + case QEvent::HoverMove: + handleHoverMoveEvent(static_cast(event)); + break; + } +} + +void WidgetData::updateRubberBandStatus(void) +{ + if (d->m_bRubberBandOnMove || d->m_bRubberBandOnResize) + { + if (NULL == m_pRubberBand) + m_pRubberBand = new QRubberBand(QRubberBand::Rectangle); + } + else + { + delete m_pRubberBand; + m_pRubberBand = NULL; + } +} + +void WidgetData::updateCursorShape(const QPoint &gMousePos) +{ + if (m_pWidget->isFullScreen() || m_pWidget->isMaximized()) + { + if (m_bCursorShapeChanged) + { + m_pWidget->unsetCursor(); + } + return; + } + + m_moveMousePos.recalculate(gMousePos, m_pWidget->frameGeometry()); + + if(m_moveMousePos.onTopLeftEdge || m_moveMousePos.onBottomRightEdge) + { + m_pWidget->setCursor( Qt::SizeFDiagCursor ); + m_bCursorShapeChanged = true; + } + else if(m_moveMousePos.onTopRightEdge || m_moveMousePos.onBottomLeftEdge) + { + m_pWidget->setCursor( Qt::SizeBDiagCursor ); + m_bCursorShapeChanged = true; + } + else if(m_moveMousePos.onLeftEdge || m_moveMousePos.onRightEdge) + { + m_pWidget->setCursor( Qt::SizeHorCursor ); + m_bCursorShapeChanged = true; + } + else if(m_moveMousePos.onTopEdge || m_moveMousePos.onBottomEdge) + { + m_pWidget->setCursor( Qt::SizeVerCursor ); + m_bCursorShapeChanged = true; + } + else + { + if (m_bCursorShapeChanged) + { + m_pWidget->unsetCursor(); + m_bCursorShapeChanged = false; + } + } +} + +void WidgetData::resizeWidget(const QPoint &gMousePos) +{ + QRect origRect; + + if (d->m_bRubberBandOnResize) + origRect = m_pRubberBand->frameGeometry(); + else + origRect = m_pWidget->frameGeometry(); + + int left = origRect.left(); + int top = origRect.top(); + int right = origRect.right(); + int bottom = origRect.bottom(); + origRect.getCoords(&left, &top, &right, &bottom); + + int minWidth = m_pWidget->minimumWidth(); + int minHeight = m_pWidget->minimumHeight(); + + if (m_pressedMousePos.onTopLeftEdge) + { + left = gMousePos.x(); + top = gMousePos.y(); + } + else if (m_pressedMousePos.onBottomLeftEdge) + { + left = gMousePos.x(); + bottom = gMousePos.y(); + } + else if (m_pressedMousePos.onTopRightEdge) + { + right = gMousePos.x(); + top = gMousePos.y(); + } + else if (m_pressedMousePos.onBottomRightEdge) + { + right = gMousePos.x(); + bottom = gMousePos.y(); + } + else if (m_pressedMousePos.onLeftEdge) + { + left = gMousePos.x(); + } + else if (m_pressedMousePos.onRightEdge) + { + right = gMousePos.x(); + } + else if (m_pressedMousePos.onTopEdge) + { + top = gMousePos.y(); + } + else if (m_pressedMousePos.onBottomEdge) + { + bottom = gMousePos.y(); + } + + QRect newRect(QPoint(left, top), QPoint(right, bottom)); + + if (newRect.isValid()) + { + if (minWidth > newRect.width()) + { + if (left != origRect.left()) + newRect.setLeft(origRect.left()); + else + newRect.setRight(origRect.right()); + } + if (minHeight > newRect.height()) + { + if (top != origRect.top()) + newRect.setTop(origRect.top()); + else + newRect.setBottom(origRect.bottom()); + } + + if (d->m_bRubberBandOnResize) + { + m_pRubberBand->setGeometry(newRect); + } + else + { + m_pWidget->setGeometry(newRect); + } + } +} + +void WidgetData::moveWidget(const QPoint& gMousePos) +{ + if (d->m_bRubberBandOnMove) + { + m_pRubberBand->move(gMousePos - m_ptDragPos); + } + else + { + m_pWidget->move(gMousePos - m_ptDragPos); + } +} + +void WidgetData::handleMousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + m_bLeftButtonPressed = true; + m_bLeftButtonTitlePressed = event->pos().y() < m_moveMousePos.m_nTitleHeight; + + QRect frameRect = m_pWidget->frameGeometry(); + m_pressedMousePos.recalculate(event->globalPos(), frameRect); + + m_ptDragPos = event->globalPos() - frameRect.topLeft(); + + if (m_pressedMousePos.onEdges) + { + if (d->m_bRubberBandOnResize) + { + m_pRubberBand->setGeometry(frameRect); + m_pRubberBand->show(); + } + } + else if (d->m_bRubberBandOnMove) + { + m_pRubberBand->setGeometry(frameRect); + m_pRubberBand->show(); + } + } +} + +void WidgetData::handleMouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + m_bLeftButtonPressed = false; + m_bLeftButtonTitlePressed = false; + m_pressedMousePos.reset(); + if (m_pRubberBand && m_pRubberBand->isVisible()) + { + m_pRubberBand->hide(); + m_pWidget->setGeometry(m_pRubberBand->geometry()); + } + } +} + +void WidgetData::handleMouseMoveEvent(QMouseEvent *event) +{ + if (m_bLeftButtonPressed) + { + if (d->m_bWidgetResizable && m_pressedMousePos.onEdges) + { + resizeWidget(event->globalPos()); + } + else if (d->m_bWidgetMovable && m_bLeftButtonTitlePressed) + { + moveWidget(event->globalPos()); + } + } + else if (d->m_bWidgetResizable) + { + updateCursorShape(event->globalPos()); + } +} + +void WidgetData::handleLeaveEvent(QEvent *event) +{ + Q_UNUSED(event) + if (!m_bLeftButtonPressed) + { + m_pWidget->unsetCursor(); + } +} + +void WidgetData::handleHoverMoveEvent(QHoverEvent *event) +{ + if (d->m_bWidgetResizable) + { + updateCursorShape(m_pWidget->mapToGlobal(event->pos())); + } +} + +WindowData::WindowData(DDFramelessHelperPrivate *_d, QWindow *pTopLevelWidget) +{ + d = _d; + m_pWindow = pTopLevelWidget; + m_bLeftButtonPressed = false; + m_bCursorShapeChanged = false; + m_bLeftButtonTitlePressed = false; + m_pRubberBand = NULL; + m_windowFlags = m_pWindow->flags(); + updateRubberBandStatus(); +} +WindowData::~WindowData() +{ + if(m_pWindow){ + m_pWindow->setFlags(m_windowFlags); + } + delete m_pRubberBand; + m_pRubberBand = NULL; +} + +QWindow* WindowData::window() +{ + return m_pWindow; +} + +void WindowData::handleWidgetEvent(QEvent *event) +{ + switch (event->type()) + { + default: + break; + case QEvent::MouseButtonPress: + handleMousePressEvent(static_cast(event)); + break; + case QEvent::MouseButtonRelease: + handleMouseReleaseEvent(static_cast(event)); + break; + case QEvent::MouseMove: + handleMouseMoveEvent(static_cast(event)); + break; + case QEvent::Leave: + handleLeaveEvent(static_cast(event)); + break; + case QEvent::HoverMove: + handleHoverMoveEvent(static_cast(event)); + break; + } +} + +void WindowData::updateRubberBandStatus(void) +{ + if (d->m_bRubberBandOnMove || d->m_bRubberBandOnResize) + { + if (NULL == m_pRubberBand) + m_pRubberBand = new QRubberBand(QRubberBand::Rectangle); + } + else + { + delete m_pRubberBand; + m_pRubberBand = NULL; + } +} + +void WindowData::updateCursorShape(const QPoint &gMousePos) +{ + m_moveMousePos.recalculate(gMousePos, m_pWindow->frameGeometry()); + + if(m_moveMousePos.onTopLeftEdge || m_moveMousePos.onBottomRightEdge) + { + m_pWindow->setCursor( Qt::SizeFDiagCursor ); + m_bCursorShapeChanged = true; + } + else if(m_moveMousePos.onTopRightEdge || m_moveMousePos.onBottomLeftEdge) + { + m_pWindow->setCursor( Qt::SizeBDiagCursor ); + m_bCursorShapeChanged = true; + } + else if(m_moveMousePos.onLeftEdge || m_moveMousePos.onRightEdge) + { + m_pWindow->setCursor( Qt::SizeHorCursor ); + m_bCursorShapeChanged = true; + } + else if(m_moveMousePos.onTopEdge || m_moveMousePos.onBottomEdge) + { + m_pWindow->setCursor( Qt::SizeVerCursor ); + m_bCursorShapeChanged = true; + } + else + { + if (m_bCursorShapeChanged) + { + m_pWindow->unsetCursor(); + m_bCursorShapeChanged = false; + } + } +} + +void WindowData::resizeWidget(const QPoint &gMousePos) +{ + QRect origRect; + + if (d->m_bRubberBandOnResize) + origRect = m_pRubberBand->frameGeometry(); + else + origRect = m_pWindow->frameGeometry(); + + int left = origRect.left(); + int top = origRect.top(); + int right = origRect.right(); + int bottom = origRect.bottom(); + origRect.getCoords(&left, &top, &right, &bottom); + + int minWidth = m_pWindow->minimumWidth(); + int minHeight = m_pWindow->minimumHeight(); + + if (m_pressedMousePos.onTopLeftEdge) + { + left = gMousePos.x(); + top = gMousePos.y(); + } + else if (m_pressedMousePos.onBottomLeftEdge) + { + left = gMousePos.x(); + bottom = gMousePos.y(); + } + else if (m_pressedMousePos.onTopRightEdge) + { + right = gMousePos.x(); + top = gMousePos.y(); + } + else if (m_pressedMousePos.onBottomRightEdge) + { + right = gMousePos.x(); + bottom = gMousePos.y(); + } + else if (m_pressedMousePos.onLeftEdge) + { + left = gMousePos.x(); + } + else if (m_pressedMousePos.onRightEdge) + { + right = gMousePos.x(); + } + else if (m_pressedMousePos.onTopEdge) + { + top = gMousePos.y(); + } + else if (m_pressedMousePos.onBottomEdge) + { + bottom = gMousePos.y(); + } + + QRect newRect(QPoint(left, top), QPoint(right, bottom)); + + if (newRect.isValid()) + { + if (minWidth > newRect.width()) + { + if (left != origRect.left()) + newRect.setLeft(origRect.left()); + else + newRect.setRight(origRect.right()); + } + if (minHeight > newRect.height()) + { + if (top != origRect.top()) + newRect.setTop(origRect.top()); + else + newRect.setBottom(origRect.bottom()); + } + + if (d->m_bRubberBandOnResize) + { + m_pRubberBand->setGeometry(newRect); + } + else + { + m_pWindow->setGeometry(newRect); + } + } +} + +void WindowData::moveWidget(const QPoint& gMousePos) +{ + if (d->m_bRubberBandOnMove) + { + m_pRubberBand->move(gMousePos - m_ptDragPos); + } + else + { + m_pWindow->setPosition(gMousePos - m_ptDragPos); + } +} + +void WindowData::handleMousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + m_bLeftButtonPressed = true; + m_bLeftButtonTitlePressed = event->pos().y() < m_moveMousePos.m_nTitleHeight; + + QRect frameRect = m_pWindow->frameGeometry(); + m_pressedMousePos.recalculate(event->globalPos(), frameRect); + + m_ptDragPos = event->globalPos() - frameRect.topLeft(); + + if (m_pressedMousePos.onEdges) + { + if (d->m_bRubberBandOnResize) + { + m_pRubberBand->setGeometry(frameRect); + m_pRubberBand->show(); + } + } + else if (d->m_bRubberBandOnMove) + { + m_pRubberBand->setGeometry(frameRect); + m_pRubberBand->show(); + } + } +} + +void WindowData::handleMouseReleaseEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton) + { + m_bLeftButtonPressed = false; + m_bLeftButtonTitlePressed = false; + m_pressedMousePos.reset(); + if (m_pRubberBand && m_pRubberBand->isVisible()) + { + m_pRubberBand->hide(); + m_pWindow->setGeometry(m_pRubberBand->geometry()); + } + } +} + +void WindowData::handleMouseMoveEvent(QMouseEvent *event) +{ + if (m_bLeftButtonPressed) + { + if (d->m_bWidgetResizable && m_pressedMousePos.onEdges) + { + resizeWidget(event->globalPos()); + } + else if (d->m_bWidgetMovable && m_bLeftButtonTitlePressed) + { + moveWidget(event->globalPos()); + } + } + else if (d->m_bWidgetResizable) + { + updateCursorShape(event->globalPos()); + } +} + +void WindowData::handleLeaveEvent(QEvent *event) +{ + Q_UNUSED(event) + if (!m_bLeftButtonPressed) + { + m_pWindow->unsetCursor(); + } +} + +void WindowData::handleHoverMoveEvent(QHoverEvent *event) +{ + if (d->m_bWidgetResizable) + { + updateCursorShape(m_pWindow->mapToGlobal(event->pos())); + } +} + +void WindowData::handleDoubleClick(QMouseEvent *event) +{ + +} +/**********DDFramelessHelper**********/ +DDFramelessHelper::DDFramelessHelper(QObject *parent) + : QObject(parent), + d(new DDFramelessHelperPrivate()) +{ + d->m_bWidgetMovable = true; + d->m_bWidgetResizable = true; + d->m_bRubberBandOnResize = false; + d->m_bRubberBandOnMove = false; +} + +DDFramelessHelper::~DDFramelessHelper() +{ + QList keys = d->m_widgetDataHash.keys(); + int size = keys.size(); + for (int i = 0; i < size; ++i) + { + delete d->m_widgetDataHash.take(keys[i]); + } + + delete d; +} + +bool DDFramelessHelper::eventFilter(QObject *obj, QEvent *event) +{ + switch (event->type()) + { + case QEvent::MouseMove: + case QEvent::HoverMove: + case QEvent::MouseButtonPress: + case QEvent::MouseButtonRelease: + case QEvent::Leave: + { + WidgetData *data = d->m_widgetDataHash.value(static_cast(obj)); + if (data) + { + data->handleWidgetEvent(event); + return true; + } + WindowData *dataWindow = d->m_windowDataHash.value(static_cast(obj)); + if (dataWindow) + { + dataWindow->handleWidgetEvent(event); + return false; + } + } + } + return QObject::eventFilter(obj, event); +} + +void DDFramelessHelper::activateOn(QWidget *topLevelWidget) +{ + if (!d->m_widgetDataHash.contains(topLevelWidget)) + { + WidgetData *data = new WidgetData(d, topLevelWidget); + d->m_widgetDataHash.insert(topLevelWidget, data); + + topLevelWidget->installEventFilter(this); + } +} + +void DDFramelessHelper::activateOnQmlWidget(QWindow *topLevelWidget) +{ + if (!d->m_windowDataHash.contains(topLevelWidget)) + { + WindowData *data = new WindowData(d, topLevelWidget); + d->m_windowDataHash.insert(topLevelWidget, data); + topLevelWidget->installEventFilter(this); + } +} + +void DDFramelessHelper::removeFrom(QWidget *topLevelWidget) +{ + WidgetData *data = d->m_widgetDataHash.take(topLevelWidget); + if (data) + { + topLevelWidget->removeEventFilter(this); + delete data; + } +} + +void DDFramelessHelper::removeQmlWidgetFrom(QWindow *topLevelWidget) +{ + WindowData *data = d->m_windowDataHash.take(topLevelWidget); + if (data) + { + topLevelWidget->removeEventFilter(this); + delete data; + } +} + +void DDFramelessHelper::setRubberBandOnMove(bool movable) +{ + d->m_bRubberBandOnMove = movable; + QList list = d->m_widgetDataHash.values(); + foreach (WidgetData *data, list) + { + data->updateRubberBandStatus(); + } +} + +void DDFramelessHelper::setWidgetMovable(bool movable) +{ + d->m_bWidgetMovable = movable; +} + +void DDFramelessHelper::setWidgetResizable(bool resizable) +{ + d->m_bWidgetResizable = resizable; +} + +void DDFramelessHelper::setRubberBandOnResize(bool resizable) +{ + d->m_bRubberBandOnResize = resizable; + QList list = d->m_widgetDataHash.values(); + foreach (WidgetData *data, list) + { + data->updateRubberBandStatus(); + } +} + +void DDFramelessHelper::setBorderWidth(uint width) +{ + if (width > 0) + { + CursorPosCalculator::m_nBorderWidth = width; + } +} + +void DDFramelessHelper::setTitleHeight(uint height) +{ + if (height > 0) + { + CursorPosCalculator::m_nTitleHeight = height; + } +} + +bool DDFramelessHelper::widgetMovable() +{ + return d->m_bWidgetMovable; +} + +bool DDFramelessHelper::widgetResizable() +{ + return d->m_bWidgetResizable; +} + +bool DDFramelessHelper::rubberBandOnMove() +{ + return d->m_bRubberBandOnMove; +} + +bool DDFramelessHelper::rubberBandOnResisze() +{ + return d->m_bRubberBandOnResize; +} + +uint DDFramelessHelper::borderWidth() +{ + return CursorPosCalculator::m_nBorderWidth; +} + +uint DDFramelessHelper::titleHeight() +{ + return CursorPosCalculator::m_nTitleHeight; +} diff --git a/ddui/ddframeless_helper.h b/ddui/ddframeless_helper.h new file mode 100644 index 0000000..1a4047e --- /dev/null +++ b/ddui/ddframeless_helper.h @@ -0,0 +1,70 @@ +/********************************************************************************* + *Copyright(C),2014-2019,www.heilqt.com + *FileName(文件名): frameless_helper + *Author (作者): TobyYi(tanboy@heilqt.com) + *Version (版本): 1.0.0 + *CreateDate(创建日期): 2017-05-18 + *FinishDate(完成日期): 2017-05-18 + *Description(描述): + 1.用于主要说明此程序文件完成的主要功能 + 2.与其他模块或函数的接口、输出值、取值范围、含义及参数间的控制、顺序、独立及依赖关系 + + *Others(其他内容说明):参考相关博客文章 + others + *Function List(函数列表): + 1.主要函数列表,每条记录应包含函数名及功能简要说明 + + 2. + *History(历史修订记录): + 1.Date: 修改日期 + Author:修改者 + Modification:修改内容简介 + + 2. + +**********************************************************************************/ + +#ifndef FRAMELESS_HELPER_H +#define FRAMELESS_HELPER_H + +#include +#include + +class QWidget; +class DDFramelessHelperPrivate; + +class DDFramelessHelper : public QObject +{ + Q_OBJECT + +public: + DDFramelessHelper(QObject *parent = 0); + ~DDFramelessHelper(); + void activateOn(QWidget *topLevelWidget); + void activateOnQmlWidget(QWindow *topLevelWidget); + + void removeFrom(QWidget *topLevelWidget); + void removeQmlWidgetFrom(QWindow *topLevelWidget); + + + void setWidgetMovable(bool movable); + void setWidgetResizable(bool resizable); + void setRubberBandOnMove(bool movable); + void setRubberBandOnResize(bool resizable); + void setBorderWidth(uint width); + void setTitleHeight(uint height); + bool widgetResizable(); + bool widgetMovable(); + bool rubberBandOnMove(); + bool rubberBandOnResisze(); + uint borderWidth(); + uint titleHeight(); + +protected: + virtual bool eventFilter(QObject *obj, QEvent *event); + +private: + DDFramelessHelperPrivate *d; +}; + +#endif //FRAMELESS_HELPER_H diff --git a/ddui/ddnewquickwindow.cpp b/ddui/ddnewquickwindow.cpp new file mode 100644 index 0000000..482c875 --- /dev/null +++ b/ddui/ddnewquickwindow.cpp @@ -0,0 +1,126 @@ +#include "ddnewquickwindow.h" +#include +#include +#include +#include + +DDNewQuickWindow::DDNewQuickWindow(QQuickView *parent) : QQuickView(parent) +{ + setFlags(Qt::FramelessWindowHint|Qt::WindowStaysOnTopHint); + setColor(Qt::transparent); + setResizeMode(QQuickView::SizeRootObjectToView); + setMinimumWidth(816); + mHelper = new DDFramelessHelper(this); + mHelper->activateOnQmlWidget(this); + mHelper->setTitleHeight(100); +} +/// +/// \brief YbQuickView::showTrayIcon +/// 显示系统托盘 可扩展 +/// +void DDNewQuickWindow::showTrayIcon(){ + QObject *root = 0; + if (rootObject() != NULL) + { + root = rootObject(); + QAction *minimizeAction = new QAction(QObject::tr("Mi&nimize"), this); + root->connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide())); + QAction *maximizeAction = new QAction(QObject::tr("Ma&ximize"), this); + root->connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized())); + QAction *restoreAction = new QAction(QObject::tr("&Restore"), this); + root->connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal())); + QAction *quitAction = new QAction(QObject::tr("&Quit"), this); + root->connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); + + QMenu *trayIconMenu = new QMenu(); + trayIconMenu->addAction(minimizeAction); + trayIconMenu->addAction(maximizeAction); + trayIconMenu->addAction(restoreAction); + trayIconMenu->addSeparator(); + trayIconMenu->addAction(quitAction); + + QSystemTrayIcon *trayIcon = new QSystemTrayIcon(this); + trayIcon->setContextMenu(trayIconMenu); + trayIcon->setIcon(QIcon(":/360logo.ico")); + trayIcon->show(); + } + +} +/// +/// \brief DDNewQuickWindow::setSourceAndRegsiterObj +/// \param url +/// \param regsiter +/// 加载主qml界面 +/// 并且注册C++对象到qml,方便与qml进行交互 +/// +void DDNewQuickWindow::setSourceAndRegsiterObj(const QUrl &url, bool regsiter) +{ +#ifndef USE_YOUZAN + this->rootContext()->setContextProperty("yzObj", &yZObj); +#endif + if(regsiter){ + //model需要在setsource之前设置 + mTableModel.initData(14); + mMyModel.initData(5); + this->rootContext()->setContextProperty("mTableModel", &mTableModel); + this->rootContext()->setContextProperty("mMyModel", &mMyModel); + setSource(url); + //setSource后才能得到obj对象 + m_Obj = this->rootObject(); + connect(m_Obj,SIGNAL(signalQmlOptions(QVariant,QString)),this,SLOT(slotRecevQmlReq(QVariant,QString))); + } +} +/// +/// \brief YbQuickView::slotRecevQmlReq +/// \param var +/// \param cmd +/// 接受来自QML的请求 +/// +void DDNewQuickWindow::slotRecevQmlReq(QVariant var, QString cmd) +{ + if(var.toString()=="system"){ + if(cmd == "close"){ + this->close(); + qApp->quit(); + }else if(cmd == "min"){ + this->showMinimized(); + } + } + +} +/// +/// \brief DDNewQuickWindow::mouseDoubleClickEvent +/// \param event +/// 双击可最大化窗口和还原窗口大小 +/// +void DDNewQuickWindow::mouseDoubleClickEvent(QMouseEvent *event) +{ + QRect rect(10,2,this->width()-70,mHelper->titleHeight()); + + if(event->button() == Qt::LeftButton && rect.contains(event->pos())) { + if(!isMax){ + isMax = !isMax; + slotShowMaxAndNormal(true); + showMaximized(); + update(); + }else{ + isMax = !isMax; + slotShowMaxAndNormal(false); + showNormal(); + update(); + } + } + QQuickView::mouseDoubleClickEvent(event); +} +/// +/// \brief YbQuickView::slotShowMaxAndNormal +/// \param showMax +/// 你可以注册该方法到QML当中 +void DDNewQuickWindow::slotShowMaxAndNormal(bool showMax) +{ + if(m_Obj){ + QVariant returnVal; + QMetaObject::invokeMethod(m_Obj,"transToQml",Q_RETURN_ARG(QVariant,returnVal), + Q_ARG(QVariant,showMax)); + } +} diff --git a/ddui/ddnewquickwindow.h b/ddui/ddnewquickwindow.h new file mode 100644 index 0000000..c797612 --- /dev/null +++ b/ddui/ddnewquickwindow.h @@ -0,0 +1,40 @@ +#ifndef DDNEWQUICKWINDOW_H +#define DDNEWQUICKWINDOW_H + +#include +#include +#include + +#include +#include "youzan/youzanobject.h" +#include "model/bdtablemodel.h" + +#include "ddframeless_helper.h" + +class DDNewQuickWindow : public QQuickView +{ + Q_OBJECT +public: + explicit DDNewQuickWindow(QQuickView *parent = nullptr); + +signals: + +public slots: + void setSourceAndRegsiterObj(const QUrl &url, bool regsiter=true); + void showTrayIcon(); +protected: + void mouseDoubleClickEvent(QMouseEvent *event); +private slots: + void slotRecevQmlReq(QVariant var, QString cmd); +private: + QObject *m_Obj{nullptr}; + YouZanObject yZObj; + BDTableModel mTableModel; + BDTableModel mMyModel; + bool isMax{false}; + DDFramelessHelper *mHelper{nullptr}; +private: + void slotShowMaxAndNormal(bool showMax); +}; + +#endif // DDNEWQUICKWINDOW_H diff --git a/images/matrix.png b/images/matrix.png new file mode 100644 index 0000000..6c21d04 Binary files /dev/null and b/images/matrix.png differ diff --git a/main.cpp b/main.cpp index d0f2bc4..e6b68a9 100644 --- a/main.cpp +++ b/main.cpp @@ -1,12 +1,22 @@ #include #include +#include + #include "ddui/ddview.h" #include "ddui/ddquickview.h" +#include "ddui/ddnewquickwindow.h" + +#define USE_NEW_WINDOW 1 int main(int argc, char *argv[]) { QApplication app(argc, argv); QApplication::setQuitOnLastWindowClosed(false); + QFont font; + font.setFamily("Microsoft YaHei"); + font.setPixelSize(12); + app.setFont(font); +#ifdef USE_NEW_WINDOW YbQuickView view; view.setFlags(Qt::FramelessWindowHint|Qt::Window); view.setHasMouse(false); @@ -18,5 +28,13 @@ int main(int argc, char *argv[]) view.showTrayIcon(); view.show(); view.setCanMoveRange(QPoint(view.width(),50)); +#else + + DDNewQuickWindow window; + window.setFlags(Qt::FramelessWindowHint|Qt::Window); + window.setSourceAndRegsiterObj(QUrl::fromLocalFile("Poetry/DDPoeTryPage.qml")); + window.show(); + window.showTrayIcon(); +#endif return app.exec(); } diff --git a/matrix/MatrixItem.qml b/matrix/MatrixItem.qml new file mode 100644 index 0000000..542c2d4 --- /dev/null +++ b/matrix/MatrixItem.qml @@ -0,0 +1,71 @@ +import QtQuick 2.0 + +Canvas { + id: canvas + width: 100 + height: 200 + property bool userHor: true + property int speedinterval: 40 + property var context + property var w: 0 + property var h: 0 + property var drop:[] + property var wordsArr:[] + property var font_size: 16 + + property var clearColor: 'rgba(0, 0, 0, .1)'; //每次循环加0.1透明的蒙层 + property var lttime: 0 + property var columns: 0; // 字体下落速度 + property var wordColor + property var words + property var textColor: "green" + onPaint: { + var context = canvas.getContext("2d"); + drawMatrix(context); + } + onWidthChanged: { + initData() + } + + Timer{ + id:timeId + interval: speedinterval; running: true; repeat: true + onTriggered: { + requestPaint() + } + } + //以下为js函数 绘制 + function drawMatrix(context){ + context.fillStyle = clearColor; + context.fillRect(0,0,canvas.width,canvas.height); + context.fillStyle=textColor; + context.font = font_size+"px arial"; + for(var i=0;i(canvas.height*2/3)&&Math.random()>0.85)/*reset*/ + drop[i]=0; + }else{ + context.fillText(text,drop[i]*font_size,i*font_size);/*get 0 and 1*/ + if(drop[i]*font_size>(canvas.width*2/3)&&Math.random()>0.85)/*reset*/ + drop[i]=0; + } + drop[i]++; + } + } + function initData(){ + words = "0123456789qwertyuiopasdfghjklzxcvbnm,./;'\大数据[]QWERTYUIOP{}ASDFGHJHJKL:ZXCVBBNM<>?がガぎギぐグげゲごゴきゃキャきゅキュきょキョりゃリャゅリュりょリョ" + wordsArr = words.split('') + drop=[]; + font_size =16; + if(userHor){ + columns = canvas.width/font_size; + }else{ + columns = canvas.height/font_size; + } + console.log("--cal--columns-------- "+columns) + for(var i=0;iddui/DDTopBar.qml ddui/DDuiShadowBg.qml Driver/DDDynamicTable.qml + poetry/DDPoeTryPage.qml + poetry/DDPoeTryView.qml + matrix/MatrixItem.qml + poetry/DDPoeComing.qml diff --git a/youzan/youzan.jsc b/youzan/youzan.jsc new file mode 100644 index 0000000..95e32ee Binary files /dev/null and b/youzan/youzan.jsc differ