首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

是不是有更好的办法或者更好的效果

2013-07-16 
是否有更好的办法或者更好的效果1.Qt无边框无标题栏的窗口怎么样做才能很好的还原有边框窗口可以拖拉改变

是否有更好的办法或者更好的效果
1.Qt无边框无标题栏的窗口怎么样做才能很好的还原有边框窗口可以拖拉改变大小的功能。
      我是这么做的:响应鼠标移动事件和按下事件,当鼠标移动到窗口框体边缘±10px个的时候并且按下鼠标,这样就可以拖拉改变窗口大小。然后一直resize。
      这种做法太多问题了。1.托快了不行 2.拖着拖着很容易拖不动了 3.拖动的边有点闪。。等等
      这个该怎么解决?

2.还是因为没有边框没有标题窗口引起的。窗口边缘的阴影没有了。win7默认是有的。但是开启无边框就木有了。所以觉得软件看起来有点单薄。
      网上都说放图片在背景。背景图片在我改变大小的时候有点麻烦。
      我想在上下左右都放了一个lable。黑色半透明。就可以有这个效果了。但是怎么也没搞定这个。
      还一个办法就是实时截图。获得边框图片。然后alpha一下。让他有点黑。这个这个。感觉下下策是不是有点影响效率。。

       小弟应届生,开发经验不多,公司会Qt的又都离职了,所以遇到问题有时不知道哪样做最好,分不多就拿100分求大家讨论下。。
[解决办法]


void BaseWidget::mouseMoveEvent(QMouseEvent *pEvent)
{
//鼠标是否在窗口边界的判定
//nX为相对于窗口原点的水平距离,nY为相对于窗口原点的竖直距离

if (m_bIsResize)
{
int nX = pEvent->x();
int nY = pEvent->y();


if (geometry().width() != QApplication::desktop()->availableGeometry().width()

[解决办法]
 geometry().height() != QApplication::desktop()->availableGeometry().height())
{
if (m_bIsDown) 
{
if (cursor().shape() == Qt::SizeHorCursor 
[解决办法]
 cursor().shape() == Qt::SizeVerCursor

[解决办法]
 cursor().shape() == Qt::SizeBDiagCursor 
[解决办法]
 cursor().shape() == Qt::SizeFDiagCursor)
{
int nOldX = nX - m_ptOld.x();
int nOldY = nY - m_ptOld.y();

QRect rectGeometry = geometry();

if (m_bLeft)
{
rectGeometry.setLeft(rectGeometry.left() + nOldX);
if ((rectGeometry.right() - rectGeometry.left()) < minimumWidth())
{
return;
}
}


if (m_bRight)
{
rectGeometry.setRight(rectGeometry.right() + nOldX);
}
if (m_bBottom)
{
rectGeometry.setBottom(rectGeometry.bottom() + nOldY);
}

setGeometry(rectGeometry);

m_ptOld = QPoint(!m_bLeft ? pEvent->x() : m_ptOld.x(), pEvent->y());
}


else
{
QRect rectR = rect();

m_bLeft = qAbs(nX - rectR.left()) <= 1;
m_bRight = qAbs(nX - rectR.right()) <= 1;
m_bBottom = qAbs(nY - rectR.bottom()) <= 1;

bool bHorR = m_bLeft 
[解决办法]
 m_bRight;

if (bHorR && m_bBottom)
{
if (m_bLeft)
{
setCursor(Qt::SizeBDiagCursor);
}
else
{
setCursor(Qt::SizeFDiagCursor);
}

else if (bHorR) 
{
setCursor(Qt::SizeHorCursor);

else if (m_bBottom) 
{
setCursor(Qt::SizeVerCursor);

else 
{
setCursor(Qt::ArrowCursor);
}

}
}
}
}


[解决办法]
拖动无边框窗体的功能,最简单的就是放个状态栏,它上面自带该功能

或者自己画个小三角,然后在消息中实现(这个应该就无法跨平台了,只适合Wiondows)
消息是:WM_NCHITTEST
[解决办法]
这个网上有篇帖子里有源代码,直接粘上就可以用。
但是要注意:
    如果你的主窗口是QMainWindow,获取mouseMoveEvent的时候获取不到,需要对QMainWindow以及他的CentrolWidget同时设置setMouseTrecking(true)
[解决办法]
1. 改变窗口大小的问题在Qt里做出来效果很差,这个至今找不到更好的办法,直接使用QSizeGrip组件都无法把问题解决的很好。因为改变窗口事件是系统事件。

2. 无规则窗口阴影:可以去参考一下Android的Nine-Patch技术,网上有源码,就可以在窗口大小变化时阴影效果仍然很好。
[解决办法]
改变窗口大小可以重载winEvent,对HITTEST消息做处理,这样的话比重载mouseEvent效率要高。

热点排行