很久以前我试图找到如何将QDialog窗口粘贴到屏幕边框的方法,例如 Skype windows这样的小项目,但我失败了。可能是我在不正确的地方看这个代码,所以现在我在堆栈上寻找解决方案! :)
那么,是否有任何人与某种代码,链接,样本达成协议?
在我看来,我们必须重新实现QDialog moveEvent函数,如下所示,但该代码不起作用:
void CDialog::moveEvent(QMoveEvent * event) {
QRect wndRect;
int leftTaskbar = 0, rightTaskbar = 0, topTaskbar = 0, bottomTaskbar = 0;
// int top = 0, left = 0, right = 0, bottom = 0;
wndRect = this->frameGeometry();
// Screen resolution
int screenWidth = QApplication::desktop()->width();
int screenHeight = QApplication::desktop()->height();
int wndWidth = wndRect.right() - wndRect.left();
int wndHeight = wndRect.bottom() - wndRect.top();
int posX = event->pos().x();
int posY = event->pos().y();
// Snap to screen border
// Left border
if (posX >= -m_nXOffset + leftTaskbar &&
posX <= leftTaskbar + m_nXOffset) {
//left = leftTaskbar;
this->move(leftTaskbar, posY);
return;
}
// Top border
if (posY >= -m_nYOffset &&
posY <= topTaskbar + m_nYOffset) {
//top = topTaskbar;
this->move(posX, topTaskbar);
return;
}
// Right border
if (posX + wndWidth <= screenWidth - rightTaskbar + m_nXOffset &&
posX + wndWidth >= screenWidth - rightTaskbar - m_nXOffset) {
//right = screenWidth - rightTaskbar - wndWidth;
this->move(screenWidth - rightTaskbar - wndWidth, posY);
return;
}
// Bottom border
if (posY + wndHeight <= screenHeight - bottomTaskbar + m_nYOffset &&
posY + wndHeight >= screenHeight - bottomTaskbar - m_nYOffset) {
//bottom = screenHeight - bottomTaskbar - wndHeight;
this->move(posX, screenHeight - bottomTaskbar - wndHeight);
return;
}
QDialog::moveEvent(event);
}
感谢。
答案 0 :(得分:1)
您认为可以在moveEvent函数中实现此目的。 我想以下代码可以解决这个问题,但由于我没有在这里测试,我会编写一些伪代码:
首先获得可用的屏幕区域:
const QRect screen = QApplication::availableGeometry(this);
// This get the screen rect where you can drag a dialog
然后获取对话框相对于桌面的位置(如果对话框是其他小部件的子对象,则需要将小部件相对于桌面相对的坐标转换):
const QRect dialog = geometry();
// Do here transformation
现在测试对话框是否接近屏幕边框
if( abs(dialog.left()-screen.left() < OFFSET )
move(screen.left(), dialog.top();
else if( abs(dialog.top()-screen.top() < OFFSET )
move(dialog.left(), screen.top() )
// etc. for the 2 other cases
让我知道它是否有效
答案 1 :(得分:1)
在pos
文档的QWidget
属性description中,有关于在移动事件处理方法中移动窗口的以下警告。
警告:在
move()
内拨打setGeometry()
或moveEvent()
可以 导致无限递归。
也就是说,没有正确的方法将对话框窗口粘贴在屏幕边框内。
注意: 您在KDE中观察到的行为来自Window Manager。实际上,窗口管理器是安排应用程序窗口(如对话框)以在屏幕上显示它们的窗口管理器。 KDE窗口管理器可以选择让所有应用程序窗口(称为客户端)都粘在边框上。