タスクバーをクリックしてウィンドウを最小化する
Qt::FramelessWindowHint
の実装は限られているようです。このフラグが設定されている場合、Windows は、このウィンドウを最小化または最大化できないと見なします。純粋なwinapiで実装されたこのソリューションを試しました。タスクバーをクリックしてフレームレスウィンドウを最小化および復元すると、正常に機能します。Qt は、この機能をブロックするいくつかの悪いフラグを設定しているようです。それには正当な理由があるのかもしれませんが、私にはわかりません。
winapi と Qt を併用できますが面倒です。まず、ウィンドウ フラグを設定し、Qt を使用してウィンドウを表示した後、winapi コードを実行する必要があります。そうしないと、Qt はウィンドウ フラグを上書きします。
もう 1 つの問題は、winapi を使用して境界線を削除すると、ウィンドウのジオメトリが突然変更され、Qt がそれを認識しないことです。レンダリングとイベント マッピング (マウス クリック位置を含む) が無効になります。マッピングを更新する文書化された方法が見つかりませんでした。画面の向きが変更されたことを Qt に伝えることができ、ウィンドウ ジオメトリの再計算を強制できることがわかりました。しかし、これは汚いハックのように見えます。また、QWidget::windowHandle
Qt 4 には機能がなく、Qt 5 では「変更される可能性があります」。したがって、この方法は信頼できません。しかし、とにかく、それは今動作します。最上位のウィンドウ クラス コンストラクターに配置する必要がある完全なコード (Windows 8 でテスト済み) を次に示します。
#include "windows.h"
#include <QWindow>
//...
show();
HWND hwnd = reinterpret_cast<HWND>(effectiveWinId());
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZE | WS_MAXIMIZE | WS_SYSMENU);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
setWindowFlags(windowFlags() | Qt::FramelessWindowHint);
windowHandle()->reportContentOrientationChange(Qt::PrimaryOrientation);
この問題を解決する本当の方法は、Window Qt プラットフォーム プラグインを変更することです (Qt ソースの QWindowsWindow クラスを参照してください)。デフォルトの実装から継承し、それを変更してアプリで使用する方法があるかもしれません。また、Qt の開発者に、この動作が妥当なのか、それともバグなのかを尋ねることもできます。この問題はパッチで修正できると思います。
このコードを引き続き使用する予定で、他の OS もサポートする必要がある場合は、windows 固有の実装を でラップすることを忘れないでください#ifdef Q_OS_WIN
。
タイトル バーがクリックされ、ウィンドウが最大化されていない場合にのみ、ウィンドウのドラッグを有効にする
他の問題はより簡単に修正できます。マウス イベントを処理してウィンドウのドラッグを実装する場合は、ウィンドウの状態とイベントの位置を確認し、不要な場合は移動を無効にします。
void MainWindow::mousePressEvent(QMouseEvent *e) {
if (!isMaximized() &&
e->button() == Qt::LeftButton &&
ui->title->geometry().contains(e->pos())) {
window_drag_start_pos = e->pos();
}
}
void MainWindow::mouseReleaseEvent(QMouseEvent *e) {
window_drag_start_pos = QPoint(0, 0);
}
void MainWindow::mouseMoveEvent(QMouseEvent *e) {
if (!window_drag_start_pos.isNull()) {
move(pos() + e->pos() - window_drag_start_pos);
}
}
void MainWindow::on_minimize_clicked() {
showMinimized();
}
void MainWindow::on_maximize_clicked() {
if (isMaximized()) {
showNormal();
} else {
showMaximized();
}
}
これui->title
は、偽のタイトル バーを表示するために使用されるラベルQPoint window_drag_start_pos
で、クラス変数です。