2010-04-26 104 views
3

很久以前,我試圖找到方法如何粘貼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); 
} 

感謝。

回答

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 

讓我知道,如果它

+0

@Patrice Bernassola:謝謝你的回覆。我認爲,我必須更新我的示例,因爲它已經準備好進行測試/編輯......由於我是一個很長時間的Linux用戶,在KDE中有針對這種情況的全局解決方案:所有窗口/對話框都可以被粘貼到窗口邊界,所以可能是在KDE源代碼尋找好主意...... – mosg 2010-04-27 09:56:17

1

pos財產descriptionQWidget文檔,有以下警告對這一舉動的事件處理方法中移動窗口。

警告:調用move()setGeometry()moveEvent()可以 導致無限遞歸。

也就是說,沒有合適的方法將對話框窗口粘貼到屏幕邊框內。

注意: 您在KDE中觀察到的行爲來自窗口管理器。實際上,窗口管理器是安排應用程序窗口(如對話框)以在屏幕上顯示它們的窗口管理器。 KDE窗口管理器可以讓所有應用程序窗口(稱爲客戶端)都粘在邊界上。

+0

感謝您的回覆。我會明天嘗試你的解決方案,但是在原始帖子中有一個代碼... – mosg 2010-05-11 17:36:38

+1

實際上無法工作的代碼...我能夠恢復小部件的位置,以便它可以堅持屏幕邊框。但在某些角落案例中,事件處理開始無限循環。我可以恢復代碼,但現在應該在某些情況下它不起作用。 – Lohrun 2010-05-11 19:31:38

+0

是的,我檢查了它,它只能用頂部邊框正常工作,而不與其他人一起工作。這很傷心,但這意味着我們正在以正確的方式解決這個問題...... – mosg 2010-05-12 06:18:41