LINUX.ORG.RU

#!/usr/bin/env python3
import sys
from PySide2 import QtCore, QtGui, QtWidgets

class MainWindow(QtWidgets.QWidget):
    def __init__(self, parent: QtWidgets.QWidget = None):
        super(MainWindow, self).__init__(parent=parent)

        self.setWindowTitle("Qt::WindowStates")

        states = self.get_states()
        print(states)

        vbox = QtWidgets.QVBoxLayout(self)
        vbox.setAlignment(QtCore.Qt.AlignHCenter)

        self.label = QtWidgets.QLabel(states)
        vbox.addWidget(self.label)

    def changeEvent(self, event: QtCore.QEvent):
        super(MainWindow, self).changeEvent(event)

        if event.type() == QtCore.QEvent.WindowStateChange:
            states = self.get_states()
            print(states)

            self.label.setText(states)

    def get_states(self) -> str:
        states = self.windowState()
        str = []

        if states == QtCore.Qt.WindowState.WindowNoState:
            str.append("Qt::WindowNoState")
        if states & QtCore.Qt.WindowState.WindowMinimized:
            str.append("Qt::WindowMinimized")
        if states & QtCore.Qt.WindowState.WindowMaximized:
            str.append("Qt::WindowMaximized")
        if states & QtCore.Qt.WindowState.WindowFullScreen:
            str.append("Qt::WindowFullScreen")
        if states & QtCore.Qt.WindowState.WindowActive:
            str.append("Qt::WindowActive")

        return ",".join(str)

app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

Написал программу, которая делает ровно это.
В чём подвох?

Darth_Revan ★★★★★ ()
Последнее исправление: Darth_Revan (всего исправлений: 1)
Ответ на: комментарий от slovazap

не выйдет дать main: я набросал минимальный рабочий проект, там УМВР, а весь проект целиком скидывать сюда не имеет смысла - всё равно в таком количестве строк разбираться никто не захочет

next_time ★★★★★ ()
Ответ на: комментарий от slovazap

нашёл строку, которая всё ломает


connect(&timer_for_window, SIGNAL(timeout()), this, SLOT(adjust_size()));
void MainWindow::adjust_size()
{
    resize(new_size.width(), new_size.height()); //QWidget::resize(int w, int h) 
}

то есть окно было максимизировано или зафулскринино и после этого происходит ресайз окна, но не в том же слоте, в котором делается установка setWindowState() , все его флаги сбрасываются

но не в том случае, если окно было minimized

обратите внимание, что реально размер окна при этом не меняется, оно так и остаётся maximized || fullscreen || minimized

@Darth_Revan @tnodir @moonmadness

вопрос, что с этим этим делать: писать в багтрекер? чей: qt или x-ов или это не баг?

next_time ★★★★★ ()
Ответ на: комментарий от next_time

@tnodir @slovazap минимальный нерабочий пример:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QMenu>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
    QMenu menu;
public:
    MainWindow(QWidget *parent = nullptr);
    QTimer timer, timer_for_window;
    ~MainWindow();
    virtual void mousePressEvent(QMouseEvent *event) override;
public slots:
    void switch_window_state();
    void show_window_state();
    void adjust_size();

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMouseEvent>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(&timer, SIGNAL(timeout()), this, SLOT(show_window_state()));
    timer.start(1000);
    connect(menu.addAction("switch window state"), SIGNAL(triggered()), this, SLOT(switch_window_state()));
    connect(&timer_for_window, SIGNAL(timeout()), this, SLOT(adjust_size()));
    timer_for_window.start(400);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::adjust_size()
{
    resize(100, 200);
}

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->type() != QMouseEvent::MouseButtonPress) return;
    menu.exec(event->globalPos());
}

void MainWindow::switch_window_state()
{
    auto flag = Qt::WindowMaximized;
    bool is_window_maximized = this->windowState().testFlag(flag);
    auto s = this->windowState();
    qDebug()<<s<<is_window_maximized;
    if(is_window_maximized)
        setWindowState(windowState() & ~flag);
    else
        setWindowState(windowState() | flag);
}

void MainWindow::show_window_state()
{
    qDebug()<<this->windowState();
}



next_time ★★★★★ ()
Последнее исправление: next_time (всего исправлений: 2)