| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- #include "xmainwidget.h"
- XMainWidget::XMainWidget(QWidget *parent) :
- QWidget(parent)
- {
- initVariable();
- initUI();
- }
- XMainWidget::~XMainWidget()
- {
- delete m_pTitleBar;
- delete m_pToolBar;
- delete m_pLayout;
- }
- void XMainWidget::initVariable()
- {
- m_mouseMoveWindowFlag = false;
- m_mouseResizeWindowFlag = false;
- m_isWindowMax = false;
- m_skin = ":/skin/default";
- m_pLayout = new QVBoxLayout(this);
- m_pTitleBar = new XTitleBar(this);
- m_pToolBar = new XToolBar(this);
- connect(m_pTitleBar,SIGNAL(signalClose()),this,SLOT(slotOnClose()));
- connect(m_pTitleBar,SIGNAL(signalMin()),this,SLOT(slotOnMin()));
- connect(m_pTitleBar,SIGNAL(signalMaxRestore()),this,SLOT(slotOnMaxRestore()));
- }
- void XMainWidget::initUI()
- {
- this->resize(1024,700);
- this->setWindowFlags(Qt::FramelessWindowHint);
- this->setMouseTracking(true);
- this->setLayout(m_pLayout);
- m_pLayout->addWidget(m_pTitleBar);
- m_pLayout->addWidget(m_pToolBar);
- m_pLayout->addStretch(1);
- m_pLayout->setContentsMargins(BORDER_WIDTH,BORDER_WIDTH,BORDER_WIDTH,BORDER_WIDTH);
- }
- void XMainWidget::paintEvent(QPaintEvent *e)
- {
- //绘制圆角矩形
- QBitmap bitmap(this->size());
- QPainter painter(&bitmap);
- painter.fillRect(bitmap.rect(), Qt::white);
- painter.setBrush(QColor(0, 0, 0));
- painter.drawRoundedRect(QRect(0, 0, this->width(), this->height()), 2, 2);
- setMask(bitmap);
- //绘制皮肤
- QPainter painter1(this);
- painter1.drawPixmap(rect(), QPixmap(m_skin));
- }
- void XMainWidget::mouseDoubleClickEvent(QMouseEvent *e)
- {
- if (e->button() == Qt::LeftButton && e->y()<= m_pTitleBar->height())
- {
- slotOnMaxRestore();
- }
- }
- void XMainWidget::mouseMoveEvent(QMouseEvent *e)
- {
- //获取鼠标相对于窗体的位置,设置鼠标的形状
- if(!m_mouseResizeWindowFlag)
- {
- if(!m_isWindowMax)
- m_eDirection = getMousePos(e->x(),e->y());
- else
- m_eDirection = eNone;
- }
- setCursorStyle(m_eDirection);
- if(e->buttons() == Qt::LeftButton)
- {
- //如果是移动窗体位置
- if(m_mouseMoveWindowFlag)
- {
- if(m_isWindowMax)
- {
- slotOnMaxRestore();
- }
- QPoint current_point = this->pos();
- current_point.setX(current_point.x() + e->x() - m_mouseSrcPos.x());
- current_point.setY(current_point.y() + e->y() - m_mouseSrcPos.y());
- this->move(current_point);
- return ;
- }
- //如果是调整窗体大小
- if(m_mouseResizeWindowFlag)
- {
- setDragSize(e->globalPos(),m_eDirection);
- m_mouseSrcPos = e->globalPos();
- }
- }
- }
- void XMainWidget::mousePressEvent(QMouseEvent *e)
- {
- m_mouseMoveWindowFlag = false;
- m_mouseResizeWindowFlag = false;
- if (e->button() == Qt::LeftButton)
- {
- if(m_eDirection!=eNone)
- {
- m_mouseResizeWindowFlag = true;
- m_mouseSrcPos = e->globalPos();
- }
- else if(e->y()<m_pTitleBar->height()+m_pToolBar->height()&&e->y()>BORDER_WIDTH)
- {
- m_mouseMoveWindowFlag = true;
- m_mouseSrcPos = e->pos();
- }
- }
- }
- void XMainWidget::mouseReleaseEvent(QMouseEvent *e)
- {
- m_mouseMoveWindowFlag = false;
- m_mouseResizeWindowFlag = false;
- }
- void XMainWidget::slotOnMaxRestore()
- {
- if(!m_isWindowMax)
- {
- m_rectRestoreWindow = geometry();
- setGeometry(qApp->desktop()->availableGeometry());
- m_isWindowMax = true;
- }
- else
- {
- setGeometry(m_rectRestoreWindow);
- m_isWindowMax = false;
- }
- }
- void XMainWidget::slotOnMin()
- {
- setWindowState(Qt::WindowMinimized);
- }
- void XMainWidget::slotOnClose()
- {
- close();
- }
- void XMainWidget::setCursorStyle(enum_Direction direction)
- {
- //设置上下左右以及右上、右下、左上、坐下的鼠标形状
- switch(direction)
- {
- case eTop:
- case eBottom:
- setCursor(Qt::SizeVerCursor);
- break;
- case eRight:
- case eLeft:
- setCursor(Qt::SizeHorCursor);
- break;
- case eTopRight:
- case eBottomLeft:
- setCursor(Qt::SizeBDiagCursor);
- break;
- case eRightBottom:
- case eLeftTop:
- setCursor(Qt::SizeFDiagCursor);
- break;
- default:
- setCursor(Qt::ArrowCursor);
- break;
- }
- }
- //确定点的位置方向
- XMainWidget::enum_Direction XMainWidget::getMousePos(int nXRelative,int nYRelative)
- {
- int nTop = qAbs(nYRelative)<BORDER_WIDTH ?eTop:eNone;
- int nRight = qAbs(nXRelative-rect().right())<BORDER_WIDTH ? eRight:eNone;
- int nBottom = qAbs(nYRelative-rect().bottom())<BORDER_WIDTH ? eBottom:eNone;
- int nLeft = qAbs(nXRelative)<BORDER_WIDTH ? eLeft:eNone;
- return enum_Direction(nTop + nRight + nBottom + nLeft);
- }
- void XMainWidget::setDragSize(QPoint destPos,enum_Direction direction)
- {
- //计算偏差
- int ndX = destPos.x() - m_mouseSrcPos.x();
- int ndY = destPos.y() - m_mouseSrcPos.y();
- //获得主窗口位置信息
- QRect rectWindow = geometry();
- //判别方向
- if(direction & eTop)
- {
- rectWindow.setTop(rectWindow.top()+ndY);
- }
- if(direction & eRight)
- {
- rectWindow.setRight(rectWindow.right()+ndX);
- }
- if(direction & eBottom)
- {
- rectWindow.setBottom(rectWindow.bottom()+ndY);
- }
- if(direction & eLeft)
- {
- rectWindow.setLeft(rectWindow.left()+ndX);
- }
- if(rectWindow.width()< minimumWidth() || rectWindow.height()<minimumHeight())
- {
- return;
- }
- //重新设置窗口位置为新位置信息
- setGeometry(rectWindow);
- }
|