很久以前,我試圖找到方法如何粘貼QDialog窗口到屏幕邊框爲我的小項目,如Skype窗戶做到了,但我失敗了。可能是我看到這個代碼不在正確的位置,所以現在我在這裏尋找解決方案,在堆棧上! :)How to stick QDialog to Screen Borders like Skype do?
那麼,有沒有人與某種這樣的代碼,鏈接,樣本處理?
在我看來,我們必須重新實現了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);
}
感謝。
@Patrice Bernassola:謝謝你的回覆。我認爲,我必須更新我的示例,因爲它已經準備好進行測試/編輯......由於我是一個很長時間的Linux用戶,在KDE中有針對這種情況的全局解決方案:所有窗口/對話框都可以被粘貼到窗口邊界,所以可能是在KDE源代碼尋找好主意...... – mosg 2010-04-27 09:56:17