Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MdiArea窗口最大化右上角显示异常 #123

Open
zhangzengzeng opened this issue Oct 18, 2024 · 0 comments
Open

MdiArea窗口最大化右上角显示异常 #123

zhangzengzeng opened this issue Oct 18, 2024 · 0 comments

Comments

@zhangzengzeng
Copy link

SARibbonBard 版本:最新版(未使用qwk)
qt版本:5.15.2
问题描述:MdiArea窗口最大化显示异常
异常
界面
使用方法如下:新建MainForm,其继承MenuSARibbon(par)
code
code1

问题:
在TabWidget中添加的mdiarea窗口在最大化时,右上角显示异常,该问题该如何规避

mdiarea window code:
#include "tracewindow.h"
#include "ui_tracewindow.h"

#include

QTextEdit *TraceWindow::log_text = nullptr;
QMdiSubWindow *TraceWindow::sub_window_log = nullptr;
QTextEdit *TraceWindow::parse_data_text = nullptr;
QMdiSubWindow *TraceWindow::sub_window_parse_data = nullptr;
QTextEdit *TraceWindow::origin_text = nullptr;
QMdiSubWindow *TraceWindow::sub_window_origin_data = nullptr;

TraceWindow::TraceWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::TraceWindow)
{
ui->setupUi(this);
ui->mdiArea->setBackground(Qt::NoBrush);
ui->mdiArea->setStyleSheet("background-color: #c7d1e1");
creat_windw(windows_type_t::log_data);
creat_windw(windows_type_t::parse_data);
creat_windw(windows_type_t::origin_data);
connect(ui->mdiArea, &QMdiArea::subWindowActivated, this, &TraceWindow::onMdiAreaSubWindowActivated);
}

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

void TraceWindow::creat_windw(windows_type_t window_type)
{
switch(window_type)
{
case windows_type_t::log_data:
{
if(log_text != nullptr && sub_window_log != nullptr)
{
//已经存在log窗口,无需新建
qDebug()<<"log window alread exit";
}
else
{
log_text = new QTextEdit();
sub_window_log = new QMdiSubWindow();
sub_window_log->setWidget(log_text);
sub_window_log->setWindowIcon(QIcon(":/icon/icon/log.svg"));
sub_window_log->setStyleSheet("background-color: #ffffff");
sub_window_log->resize(300,100);
sub_window_log->setWindowTitle("Log");
ui->mdiArea->addSubWindow(sub_window_log);
// 如果你用qwk,你需要安装mdi窗口的最大最小化按钮到frameless框架中,你需要绑定此槽函数
connect(sub_window_log, &QMdiSubWindow::windowStateChanged, this, &TraceWindow::onSubWindowStateChanged);
}

    break;
}
case windows_type_t::parse_data:
{
    if(parse_data_text != nullptr && sub_window_parse_data != nullptr)
    {
        //已经存在log窗口,无需新建
        qDebug()<<"log window alread exit";
    }
    else
    {
        parse_data_text       = new QTextEdit();
        sub_window_parse_data = new QMdiSubWindow();
        sub_window_parse_data->setWidget(parse_data_text);
        sub_window_parse_data->setWindowIcon(QIcon(":/icon/icon/log.svg"));
        sub_window_parse_data->setStyleSheet("background-color: #ffffff");
        sub_window_parse_data->resize(300,100);
        sub_window_parse_data->setWindowTitle("Log");
        ui->mdiArea->addSubWindow(sub_window_parse_data);
        connect(sub_window_parse_data, &QMdiSubWindow::windowStateChanged, this, &TraceWindow::onSubWindowStateChanged);
    }

    break;
}
case windows_type_t::origin_data:
{
    if(origin_text != nullptr && sub_window_origin_data != nullptr)
    {
        //已经存在log窗口,无需新建
        qDebug()<<"log window alread exit";
    }
    else
    {
        origin_text       = new QTextEdit();
        sub_window_origin_data = new QMdiSubWindow();
        sub_window_origin_data->setWidget(origin_text);
        sub_window_origin_data->setWindowIcon(QIcon(":/icon/icon/log.svg"));
        sub_window_origin_data->setStyleSheet("background-color: #ffffff");
        sub_window_origin_data->resize(300,100);
        sub_window_origin_data->setWindowTitle("Log");
        ui->mdiArea->addSubWindow(sub_window_origin_data);
        connect(sub_window_origin_data, &QMdiSubWindow::windowStateChanged, this, &TraceWindow::onSubWindowStateChanged);
    }

    break;
}
default:
{
    break;
}
}

}

void TraceWindow::Print_Info_Log(QString log)
{
if(log_text != nullptr && sub_window_log != nullptr)
{
log_text->append(log);
}
else
{
qDebug()<<"log window not exit";
}
}

/**

  • @brief 窗口激活后对cornerwidget的绑定
  • @note mdi窗口的状态变化会导致原来的cornerwidget删除,因此,subWindowActivated和windowStateChanged这两个都要绑定,
  • 防止任意一种状态变化没有监测到,例如最大化状态关闭所有窗口,再新建一个窗口,这时候它不会触发windowStateChanged,但会触发subWindowActivated
  • @param window
    /
    void TraceWindow::onMdiAreaSubWindowActivated(QMdiSubWindow
    window)
    {
    #if SARIBBON_USE_3RDPARTY_FRAMELESSHELPER
    if (window) {
    SARibbonBar* ribbon = ribbonBar();
    QWidget* cw = ribbon->cornerWidget(Qt::TopRightCorner);
    if (cw && cw != m_mdiCornerWidget) {
    qDebug() << "set mdi corner widget in frameless|onMdiAreaSubWindowActivated";
    setFramelessHitTestVisible(cw);
    m_mdiCornerWidget = cw;
    }
    }
    #endif
    }

/**

  • @brief 子窗口变化对cornerwidget的绑定
  • @param oldState
  • @param newState
    /
    void TraceWindow::onSubWindowStateChanged(Qt::WindowStates oldState, Qt::WindowStates newState)
    {
    #if SARIBBON_USE_3RDPARTY_FRAMELESSHELPER
    if (newState.testFlag(Qt::WindowMaximized)) {
    SARibbonBar
    ribbon = ribbonBar();
    QWidget* cw = ribbon->cornerWidget(Qt::TopRightCorner);
    if (cw && cw != m_mdiCornerWidget) {
    qDebug() << "set mdi corner widget in frameless|onSubWindowStateChanged";
    setFramelessHitTestVisible(cw);
    m_mdiCornerWidget = cw;
    }
    }
    #endif
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant