xmainwidget.cpp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #include "xmainwidget.h"
  2. XMainWidget::XMainWidget(QWidget *parent) :
  3. QWidget(parent)
  4. {
  5. initVariable();
  6. initUI();
  7. }
  8. XMainWidget::~XMainWidget()
  9. {
  10. delete m_pTitleBar;
  11. delete m_pToolBar;
  12. delete m_pLayout;
  13. }
  14. void XMainWidget::initVariable()
  15. {
  16. m_mouseMoveWindowFlag = false;
  17. m_mouseResizeWindowFlag = false;
  18. m_isWindowMax = false;
  19. m_skin = ":/skin/default";
  20. m_pLayout = new QVBoxLayout(this);
  21. m_pTitleBar = new XTitleBar(this);
  22. m_pToolBar = new XToolBar(this);
  23. connect(m_pTitleBar,SIGNAL(signalClose()),this,SLOT(slotOnClose()));
  24. connect(m_pTitleBar,SIGNAL(signalMin()),this,SLOT(slotOnMin()));
  25. connect(m_pTitleBar,SIGNAL(signalMaxRestore()),this,SLOT(slotOnMaxRestore()));
  26. }
  27. void XMainWidget::initUI()
  28. {
  29. this->resize(1024,700);
  30. this->setWindowFlags(Qt::FramelessWindowHint);
  31. this->setMouseTracking(true);
  32. this->setLayout(m_pLayout);
  33. m_pLayout->addWidget(m_pTitleBar);
  34. m_pLayout->addWidget(m_pToolBar);
  35. m_pLayout->addStretch(1);
  36. m_pLayout->setContentsMargins(BORDER_WIDTH,BORDER_WIDTH,BORDER_WIDTH,BORDER_WIDTH);
  37. }
  38. void XMainWidget::paintEvent(QPaintEvent *e)
  39. {
  40. //绘制圆角矩形
  41. QBitmap bitmap(this->size());
  42. QPainter painter(&bitmap);
  43. painter.fillRect(bitmap.rect(), Qt::white);
  44. painter.setBrush(QColor(0, 0, 0));
  45. painter.drawRoundedRect(QRect(0, 0, this->width(), this->height()), 2, 2);
  46. setMask(bitmap);
  47. //绘制皮肤
  48. QPainter painter1(this);
  49. painter1.drawPixmap(rect(), QPixmap(m_skin));
  50. }
  51. void XMainWidget::mouseDoubleClickEvent(QMouseEvent *e)
  52. {
  53. if (e->button() == Qt::LeftButton && e->y()<= m_pTitleBar->height())
  54. {
  55. slotOnMaxRestore();
  56. }
  57. }
  58. void XMainWidget::mouseMoveEvent(QMouseEvent *e)
  59. {
  60. //获取鼠标相对于窗体的位置,设置鼠标的形状
  61. if(!m_mouseResizeWindowFlag)
  62. {
  63. if(!m_isWindowMax)
  64. m_eDirection = getMousePos(e->x(),e->y());
  65. else
  66. m_eDirection = eNone;
  67. }
  68. setCursorStyle(m_eDirection);
  69. if(e->buttons() == Qt::LeftButton)
  70. {
  71. //如果是移动窗体位置
  72. if(m_mouseMoveWindowFlag)
  73. {
  74. if(m_isWindowMax)
  75. {
  76. slotOnMaxRestore();
  77. }
  78. QPoint current_point = this->pos();
  79. current_point.setX(current_point.x() + e->x() - m_mouseSrcPos.x());
  80. current_point.setY(current_point.y() + e->y() - m_mouseSrcPos.y());
  81. this->move(current_point);
  82. return ;
  83. }
  84. //如果是调整窗体大小
  85. if(m_mouseResizeWindowFlag)
  86. {
  87. setDragSize(e->globalPos(),m_eDirection);
  88. m_mouseSrcPos = e->globalPos();
  89. }
  90. }
  91. }
  92. void XMainWidget::mousePressEvent(QMouseEvent *e)
  93. {
  94. m_mouseMoveWindowFlag = false;
  95. m_mouseResizeWindowFlag = false;
  96. if (e->button() == Qt::LeftButton)
  97. {
  98. if(m_eDirection!=eNone)
  99. {
  100. m_mouseResizeWindowFlag = true;
  101. m_mouseSrcPos = e->globalPos();
  102. }
  103. else if(e->y()<m_pTitleBar->height()+m_pToolBar->height()&&e->y()>BORDER_WIDTH)
  104. {
  105. m_mouseMoveWindowFlag = true;
  106. m_mouseSrcPos = e->pos();
  107. }
  108. }
  109. }
  110. void XMainWidget::mouseReleaseEvent(QMouseEvent *e)
  111. {
  112. m_mouseMoveWindowFlag = false;
  113. m_mouseResizeWindowFlag = false;
  114. }
  115. void XMainWidget::slotOnMaxRestore()
  116. {
  117. if(!m_isWindowMax)
  118. {
  119. m_rectRestoreWindow = geometry();
  120. setGeometry(qApp->desktop()->availableGeometry());
  121. m_isWindowMax = true;
  122. }
  123. else
  124. {
  125. setGeometry(m_rectRestoreWindow);
  126. m_isWindowMax = false;
  127. }
  128. }
  129. void XMainWidget::slotOnMin()
  130. {
  131. setWindowState(Qt::WindowMinimized);
  132. }
  133. void XMainWidget::slotOnClose()
  134. {
  135. close();
  136. }
  137. void XMainWidget::setCursorStyle(enum_Direction direction)
  138. {
  139. //设置上下左右以及右上、右下、左上、坐下的鼠标形状
  140. switch(direction)
  141. {
  142. case eTop:
  143. case eBottom:
  144. setCursor(Qt::SizeVerCursor);
  145. break;
  146. case eRight:
  147. case eLeft:
  148. setCursor(Qt::SizeHorCursor);
  149. break;
  150. case eTopRight:
  151. case eBottomLeft:
  152. setCursor(Qt::SizeBDiagCursor);
  153. break;
  154. case eRightBottom:
  155. case eLeftTop:
  156. setCursor(Qt::SizeFDiagCursor);
  157. break;
  158. default:
  159. setCursor(Qt::ArrowCursor);
  160. break;
  161. }
  162. }
  163. //确定点的位置方向
  164. XMainWidget::enum_Direction XMainWidget::getMousePos(int nXRelative,int nYRelative)
  165. {
  166. int nTop = qAbs(nYRelative)<BORDER_WIDTH ?eTop:eNone;
  167. int nRight = qAbs(nXRelative-rect().right())<BORDER_WIDTH ? eRight:eNone;
  168. int nBottom = qAbs(nYRelative-rect().bottom())<BORDER_WIDTH ? eBottom:eNone;
  169. int nLeft = qAbs(nXRelative)<BORDER_WIDTH ? eLeft:eNone;
  170. return enum_Direction(nTop + nRight + nBottom + nLeft);
  171. }
  172. void XMainWidget::setDragSize(QPoint destPos,enum_Direction direction)
  173. {
  174. //计算偏差
  175. int ndX = destPos.x() - m_mouseSrcPos.x();
  176. int ndY = destPos.y() - m_mouseSrcPos.y();
  177. //获得主窗口位置信息
  178. QRect rectWindow = geometry();
  179. //判别方向
  180. if(direction & eTop)
  181. {
  182. rectWindow.setTop(rectWindow.top()+ndY);
  183. }
  184. if(direction & eRight)
  185. {
  186. rectWindow.setRight(rectWindow.right()+ndX);
  187. }
  188. if(direction & eBottom)
  189. {
  190. rectWindow.setBottom(rectWindow.bottom()+ndY);
  191. }
  192. if(direction & eLeft)
  193. {
  194. rectWindow.setLeft(rectWindow.left()+ndX);
  195. }
  196. if(rectWindow.width()< minimumWidth() || rectWindow.height()<minimumHeight())
  197. {
  198. return;
  199. }
  200. //重新设置窗口位置为新位置信息
  201. setGeometry(rectWindow);
  202. }