2016-10-02 128 views
2

我想創建一個不帶窗口標題欄的Qt應用程序(我想創建一個自定義窗口)。最大化窗口維護任務欄限制

我創建了三個按鈕來最小化,最大化和關閉窗口。除了考慮當我最大化窗口時,應用程序不考慮任務欄,最大化的窗口占用整個屏幕,在任務欄下進行,除此之外,一切都正常。正常的從窗口最大化命令,而不是最大化應用程序窗口,避免在任務欄下。

如果我不使用Qt::CustomizeWindowHint窗口標題欄出現,並最大化行爲是正確的;但如果我使用這個標誌,標題欄消失,應用程序就會在窗口下:在這裏你可以找到兩個截圖地名釋義的行爲:

在Windows標題: ​​

不進入Windows標題: enter image description here

正如你可以在後面的例子中看到的,「關閉」按鈕進入任務欄內部,因爲應用程序佔據整個屏幕。

如何在不使用Windows標題欄的情況下避免此行爲?我想重新創建與窗口標題欄相同的行爲。

SampleWindow.h

#ifndef SAMPLEWINDOW_H_ 
#define SAMPLEWINDOW_H_ 

#include <QMainWindow> 
#include <QPushButton> 
#include <QHBoxLayout> 

class SampleWindow : public QMainWindow { 

    Q_OBJECT 

public: 
    SampleWindow(); 
    virtual ~SampleWindow() = default; 
}; 

#endif // !SAMPLEWINDOW_H_ 

SampleWindow.cpp

#include "SampleWindow.h" 
#include <QCoreApplication> 

SampleWindow::SampleWindow() : 
QMainWindow() { 
    // With uncommenting this line the title bar disappears 
    // but application goes under the taskbar when maximized 
    // 
    //setWindowFlags(Qt::CustomizeWindowHint); 
    auto centralWidget = new QWidget(this); 
    auto layout = new QHBoxLayout(this); 
    auto minimizeButton = new QPushButton("Minimize", this); 
    auto maximizeButton = new QPushButton("Maximize", this); 
    auto closeButton = new QPushButton("Close", this); 
    layout->addWidget(minimizeButton); 
    layout->addWidget(maximizeButton); 
    layout->addWidget(closeButton); 
    centralWidget->setLayout(layout); 
    setCentralWidget(centralWidget); 
    connect(closeButton, &QPushButton::clicked, [=]() {QCoreApplication::quit();}); 
    connect(minimizeButton, &QPushButton::clicked, this, [=]() {setWindowState(Qt::WindowMinimized);}); 
    connect(maximizeButton, &QPushButton::clicked, this, [=]() {setWindowState(Qt::WindowMaximized);}); 
} 

Main.cpp的

#include <QApplication> 
#include "SampleWindow.h" 

int main(int argc, char* argv[]) { 
    QApplication app(argc, argv); 
    SampleWindow mainWindow; 
    mainWindow.show(); 
    return app.exec(); 
} 

回答

2

此行爲取決於系統。我在Windows 7和Linux Mint KDE上測試了您的代碼,並且行爲有所不同。在Windows 7任務欄已隱藏並且窗口已填充任務欄的區域。在KDE中,我注意到窗口可以正確地最大化(避免小部件面板而不隱藏它們)。

但是,當我嘗試在兼容模式下在Windows 10中運行代碼時,我只能在與Windows Vista和舊版本兼容的情況下重複Win7的行爲。

對於Windows 10,我發現另一種解決辦法:你可以將窗口最大化全屏,如果適合你:

mainWindow.showFullScreen(); 

setWindowState(Qt::WindowFullScreen); 

UPD: 除了你的解決方案,我發現另一個:

setGeometry(QApplication::desktop()->availableGeometry().x(), 
      QApplication::desktop()->availableGeometry().y(), 
      QApplication::desktop()->availableGeometry().width(), 
      QApplication::desktop()->availableGeometry().height()); 
+0

它最大化窗口隱藏任務欄。我想最大化它作爲一個正常的桌面應用程序.. – Jepessen

+0

@Jepessen,我發現了另一個解決方案 –

+0

您的解決方案比我的更清晰。 – Jepessen

1

我認爲我已經被點擊最大化按鈕在使用這個插槽中找到一個解決方案:

void SampleWindow::maximize() { 
    //setWindowState(Qt::WindowFullScreen); 
    QDesktopWidget *desktop = QApplication::desktop(); 
    QRect desktopGeometry = desktop->availableGeometry(); 
    int desktopHeight = desktopGeometry.height(); 
    int desktopWidth = desktopGeometry.width(); 
    int padx = (frameGeometry().width() - geometry().width())/2; 
    setFixedSize(desktopWidth, desktopHeight); 
    move(-padx,0); 
} 

我需要更多的測試,但目前該地區似乎是正確的。

相關問題