Я не хочу, чтобы QDockWidget изменял размер при динамическом добавлении toolbutton в панель инструментов QMainWindow

#c #qt #qt5

#c #qt #qt5

Вопрос:

Каждый раз, когда я динамически добавляю кнопку на главную панель QMainWindow, QDockWidget изменяет свой первоначальный размер.

Мой вопрос:

  • Могу ли я запретить автоматическое изменение размера QDockWidget и как мне это сделать?
  • Если я не могу этого сделать, какие другие варианты открыты для меня? возможно, ‘resizeDocks’?

Это иллюстрация моей дилеммы. Это пример приложения при запуске:

введите описание изображения здесь

Теперь я вручную изменяю размер QDockWindow.

введите описание изображения здесь

Теперь я нажимаю ‘F1’, которая создает toolbutton на панели инструментов QMainWindow, и QDockWindow автоматически изменяет свой первоначальный размер.

введите описание изображения здесь

Это код для этого простого приложения:

mainwindow.h:

 #ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QKeyEvent>
#include <QInputDialog>
#include <QToolButton>
#include <QPlainTextEdit>
#include <QDockWidget>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;    
    QToolButton *Create_toolbutton(QString);

protected:
    void keyPressEvent(QKeyEvent*);

};

#endif // MAINWINDOW_H
  

mainwindow.cpp:

 #include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setCentralWidget(new QPlainTextEdit());
    this->addDockWidget(Qt::RightDockWidgetArea, new QDockWidget());
}

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

void MainWindow::keyPressEvent(QKeyEvent * ke)
{

    if(ke->key() == Qt::Key_F1){
        ui->mainToolBar->addWidget(Create_toolbutton("new button"));
    }

    QMainWindow::keyPressEvent(ke);
}

QToolButton * MainWindow::Create_toolbutton(QString toolbutton_name)
{
    QToolButton * new_qtoolbutton = new QToolButton();
    new_qtoolbutton->setText(toolbutton_name);
    new_qtoolbutton->setArrowType(Qt::ArrowType::RightArrow);
    new_qtoolbutton->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon);
    return new_qtoolbutton;
}
  

Комментарии:

1. Мне не удалось воспроизвести вашу проблему. Не могли бы вы предоставить свой файл пользовательского интерфейса?

Ответ №1:

Я использую resizeDocks, и для меня это работает достаточно.

 #include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    this->setCentralWidget(new QPlainTextEdit());
    auto * dock = new QDockWidget();
    this->addDockWidget(Qt::RightDockWidgetArea, dock);
    resizeDocks({dock}, {100}, Qt::Horizontal);
}

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

void MainWindow::keyPressEvent(QKeyEvent * ke)
{
    if(ke->key() == Qt::Key_F1){
        ui->mainToolBar->addWidget(Create_toolbutton("new button"));
    }

    QMainWindow::keyPressEvent(ke);
}

QToolButton * MainWindow::Create_toolbutton(QString toolbutton_name)
{
    QToolButton * new_qtoolbutton = new QToolButton();
    new_qtoolbutton->setText(toolbutton_name);
    new_qtoolbutton->setArrowType(Qt::ArrowType::RightArrow);
    new_qtoolbutton->setToolButtonStyle(Qt::ToolButtonStyle::ToolButtonTextBesideIcon);
    return new_qtoolbutton;
}