Russian Qt Forum
Сентябрь 30, 2024, 10:23 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTextEdit внутри QDockWidget не хочет слушаться размеров  (Прочитано 9724 раз)
covox
Гость
« : Октябрь 05, 2008, 20:25 »

Добрый день,
Делаю прототип системы. Ранее с QT дела не имел. Проблема в том что размер QTextEdit плавает внутри QDockWidget какие бы им обоим не ставились условия по размерам. Может быть кто-то встречался с подобной проблемой?
Из картинок (S1) - как задумано. (S2) - что получается.
Привожу код. TextEdit лежит в dockLogger.
Ткните пальцем пожалуйста.
QT 4.4.1/Xcode
Код:

#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H

#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDockWidget>
#include <QtGui/QHBoxLayout>
#include <QtGui/QListWidget>
#include <QtGui/QMainWindow>
#include <QtGui/QMdiArea>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QTextEdit>
#include <QtGui/QToolBar>
#include <QtGui/QToolBox>
#include <QtGui/QVBoxLayout>
#include <QtGui/QWidget>

QT_BEGIN_NAMESPACE

class Ui_MainWindow
{
public:
    QWidget *centralwidget;
    QHBoxLayout *horizontalLayout;
    QMdiArea *mdiArea;
    QWidget *subwindow;
    QMenuBar *menubar;
    QStatusBar *statusbar;
    QToolBar *toolBar;
    QDockWidget *dockMenu;
    QWidget *dockWidgetContents;
    QVBoxLayout *verticalLayout;
    QToolBox *toolBox;
    QWidget *page;
    QVBoxLayout *verticalLayout_2;
    QListWidget *listWidget;
    QWidget *page_2;
    QDockWidget *dockLogger;
    QWidget *dockWidgetContents_2;
    QVBoxLayout *verticalLayout_3;
    QTextEdit *textEdit;

    void setupUi(QMainWindow *MainWindow)
    {
    if (MainWindow->objectName().isEmpty())
        MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(1000, 650);
    MainWindow->setDockOptions(QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::ForceTabbedDocks|QMainWindow::VerticalTabs);
    MainWindow->setUnifiedTitleAndToolBarOnMac(false);
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    horizontalLayout = new QHBoxLayout(centralwidget);
    horizontalLayout->setSpacing(0);
    horizontalLayout->setMargin(0);
    horizontalLayout->setObjectName(QString::fromUtf8("horizontalLayout"));
    mdiArea = new QMdiArea(centralwidget);
    mdiArea->setObjectName(QString::fromUtf8("mdiArea"));
    mdiArea->setFrameShadow(QFrame::Plain);
    mdiArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    mdiArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    mdiArea->setViewMode(QMdiArea::TabbedView);
    mdiArea->setTabShape(QTabWidget::Rounded);
    subwindow = new QWidget();
    subwindow->setObjectName(QString::fromUtf8("subwindow"));
    mdiArea->addSubWindow(subwindow);

    horizontalLayout->addWidget(mdiArea);

    MainWindow->setCentralWidget(centralwidget);
    menubar = new QMenuBar(MainWindow);
    menubar->setObjectName(QString::fromUtf8("menubar"));
    menubar->setGeometry(QRect(0, 0, 1000, 22));
    MainWindow->setMenuBar(menubar);
    statusbar = new QStatusBar(MainWindow);
    statusbar->setObjectName(QString::fromUtf8("statusbar"));
    MainWindow->setStatusBar(statusbar);
    toolBar = new QToolBar(MainWindow);
    toolBar->setObjectName(QString::fromUtf8("toolBar"));
    toolBar->setMinimumSize(QSize(32, 32));
    MainWindow->addToolBar(Qt::TopToolBarArea, toolBar);
    dockMenu = new QDockWidget(MainWindow);
    dockMenu->setObjectName(QString::fromUtf8("dockMenu"));
    QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
    sizePolicy.setHorizontalStretch(0);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(dockMenu->sizePolicy().hasHeightForWidth());
    dockMenu->setSizePolicy(sizePolicy);
    dockMenu->setFeatures(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable);
    dockMenu->setAllowedAreas(Qt::LeftDockWidgetArea);
    dockWidgetContents = new QWidget();
    dockWidgetContents->setObjectName(QString::fromUtf8("dockWidgetContents"));
    verticalLayout = new QVBoxLayout(dockWidgetContents);
    verticalLayout->setSpacing(0);
    verticalLayout->setMargin(0);
    verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
    toolBox = new QToolBox(dockWidgetContents);
    toolBox->setObjectName(QString::fromUtf8("toolBox"));
    toolBox->setEnabled(true);
    sizePolicy.setHeightForWidth(toolBox->sizePolicy().hasHeightForWidth());
    toolBox->setSizePolicy(sizePolicy);
    toolBox->setMinimumSize(QSize(120, 0));
    page = new QWidget();
    page->setObjectName(QString::fromUtf8("page"));
    page->setGeometry(QRect(0, 0, 256, 366));
    verticalLayout_2 = new QVBoxLayout(page);
    verticalLayout_2->setSpacing(0);
    verticalLayout_2->setMargin(0);
    verticalLayout_2->setObjectName(QString::fromUtf8("verticalLayout_2"));
    listWidget = new QListWidget(page);
    listWidget->setObjectName(QString::fromUtf8("listWidget"));
    listWidget->setFrameShape(QFrame::NoFrame);
    listWidget->setLineWidth(0);
    listWidget->setFlow(QListView::TopToBottom);
    listWidget->setResizeMode(QListView::Fixed);
    listWidget->setLayoutMode(QListView::SinglePass);

    verticalLayout_2->addWidget(listWidget);

    toolBox->addItem(page, QApplication::translate("MainWindow", "Page 1", 0, QApplication::UnicodeUTF8));
    page_2 = new QWidget();
    page_2->setObjectName(QString::fromUtf8("page_2"));
    page_2->setGeometry(QRect(0, 0, 256, 366));
    toolBox->addItem(page_2, QApplication::translate("MainWindow", "Page 2", 0, QApplication::UnicodeUTF8));

    verticalLayout->addWidget(toolBox);

    dockMenu->setWidget(dockWidgetContents);
    MainWindow->addDockWidget(static_cast<Qt::DockWidgetArea>(1), dockMenu);
    dockLogger = new QDockWidget(MainWindow);
    dockLogger->setObjectName(QString::fromUtf8("dockLogger"));
    dockLogger->setFeatures(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable);
    dockLogger->setAllowedAreas(Qt::BottomDockWidgetArea);
    dockWidgetContents_2 = new QWidget();
    dockWidgetContents_2->setObjectName(QString::fromUtf8("dockWidgetContents_2"));
    verticalLayout_3 = new QVBoxLayout(dockWidgetContents_2);
    verticalLayout_3->setSpacing(0);
    verticalLayout_3->setMargin(0);
    verticalLayout_3->setObjectName(QString::fromUtf8("verticalLayout_3"));
    verticalLayout_3->setSizeConstraint(QLayout::SetMinimumSize);
    textEdit = new QTextEdit(dockWidgetContents_2);
    textEdit->setObjectName(QString::fromUtf8("textEdit"));

    verticalLayout_3->addWidget(textEdit);

    dockLogger->setWidget(dockWidgetContents_2);
    MainWindow->addDockWidget(static_cast<Qt::DockWidgetArea>(8), dockLogger);

    retranslateUi(MainWindow);

    toolBox->setCurrentIndex(0);


    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi

    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
    subwindow->setWindowTitle(QApplication::translate("MainWindow", "Subwindow", 0, QApplication::UnicodeUTF8));
    toolBar->setWindowTitle(QApplication::translate("MainWindow", "toolBar", 0, QApplication::UnicodeUTF8));
    dockMenu->setWindowTitle(QApplication::translate("MainWindow", "\320\234\320\276\320\264\321\203\320\273\320\270 \321\201\320\270\321\201\321\202\320\265\320\274\321\213", 0, QApplication::UnicodeUTF8));
    toolBox->setItemText(toolBox->indexOf(page), QApplication::translate("MainWindow", "Page 1", 0, QApplication::UnicodeUTF8));
    toolBox->setItemText(toolBox->indexOf(page_2), QApplication::translate("MainWindow", "Page 2", 0, QApplication::UnicodeUTF8));
    dockLogger->setWindowTitle(QApplication::translate("MainWindow", "\320\241\320\277\320\270\321\201\320\276\320\272 \321\201\320\276\320\261\321\213\321\202\320\270\320\271", 0, QApplication::UnicodeUTF8));
    Q_UNUSED(MainWindow);
    } // retranslateUi

};

namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui

QT_END_NAMESPACE

#endif // UI_MAINWINDOW_H
« Последнее редактирование: Октябрь 05, 2008, 20:38 от covox » Записан
ритт
Гость
« Ответ #1 : Октябрь 05, 2008, 20:53 »

а в чём проблема-то?
на скринах кроме высоты доклета отличий больше не нашёл...сколько их в этой игре?
Записан
covox
Гость
« Ответ #2 : Октябрь 05, 2008, 21:33 »

а в чём проблема-то?
на скринах кроме высоты доклета отличий больше не нашёл...сколько их в этой игре?
Вот именно в высоте то и проблема. Высота должна быть в 80 пикселей, а не сильно за сто. 
Ставлю к примеру высоту в 80т пикселей(в минимальный размер). Полиси ставлю в минимум. Картина не меняется.
Код:
MainWindow->addDockWidget(static_cast<Qt::DockWidgetArea>(1), dockMenu);
    dockLogger = new QDockWidget(MainWindow);
    dockLogger->setObjectName(QString::fromUtf8("dockLogger"));
    dockLogger->setMinimumSize(QSize(80, 80));
    dockLogger->setFeatures(QDockWidget::DockWidgetFloatable|QDockWidget::DockWidgetMovable);
    dockLogger->setAllowedAreas(Qt::BottomDockWidgetArea);
    dockWidgetContents_2 = new QWidget();
    dockWidgetContents_2->setObjectName(QString::fromUtf8("dockWidgetContents_2"));
    QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Minimum);
    sizePolicy1.setHorizontalStretch(0);
    sizePolicy1.setVerticalStretch(0);
    sizePolicy1.setHeightForWidth(dockWidgetContents_2->sizePolicy().hasHeightForWidth());
    dockWidgetContents_2->setSizePolicy(sizePolicy1);
    dockWidgetContents_2->setMinimumSize(QSize(0, 80));
    verticalLayout_3 = new QVBoxLayout(dockWidgetContents_2);
    verticalLayout_3->setSpacing(0);
    verticalLayout_3->setMargin(0);
    verticalLayout_3->setObjectName(QString::fromUtf8("verticalLayout_3"));
    verticalLayout_3->setSizeConstraint(QLayout::SetMinimumSize);
    textEdit = new QTextEdit(dockWidgetContents_2);
    textEdit->setObjectName(QString::fromUtf8("textEdit"));
    QSizePolicy sizePolicy2(QSizePolicy::Expanding, QSizePolicy::Minimum);
    sizePolicy2.setHorizontalStretch(0);
    sizePolicy2.setVerticalStretch(0);
    sizePolicy2.setHeightForWidth(textEdit->sizePolicy().hasHeightForWidth());
    textEdit->setSizePolicy(sizePolicy2);
    textEdit->setMinimumSize(QSize(0, 80));
    textEdit->setMaximumSize(QSize(16777215, 16777215));
« Последнее редактирование: Октябрь 05, 2008, 21:40 от covox » Записан
ритт
Гость
« Ответ #3 : Октябрь 05, 2008, 22:34 »

ждать 4.5.0
Записан
covox
Гость
« Ответ #4 : Октябрь 05, 2008, 22:41 »

ждать 4.5.0
Печально. Видимо размер надо вручную контролировать. Не подскажете как это в Qt грамотнее осуществить?
Записан
ритт
Гость
« Ответ #5 : Октябрь 05, 2008, 22:48 »

я не смотрел - возможно, это уже в 4.4 имеется

бегло просмотрел сейчас код выше - код избыточен и довольно много неточностей:
попробуй заменить
Код:
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Minimum);
//...
dockWidgetContents_2->setMinimumSize(QSize(0, 80));
на
Код:
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Maximum);
//...
dockWidgetContents_2->setMaximumSize(QSize(0, 80));
либо же вообще установить максимумСайз для самого доквиджета...

зы. QString::fromUtf8 здесь ни к чему и можно смело заменить на более быстрый QLatin1String
Записан
covox
Гость
« Ответ #6 : Октябрь 05, 2008, 22:58 »


Код:
QSizePolicy sizePolicy1(QSizePolicy::Preferred, QSizePolicy::Maximum);
//...
dockWidgetContents_2->setMaximumSize(QSize(0, 80));
Так уже пробовал. Так он растягиваться по вертикали перестает.
Записан
ритт
Гость
« Ответ #7 : Октябрь 05, 2008, 23:29 »

в таком случае прошу задачу целиком - угадывать как должно быть и что не так впредь не намерен!
Записан
covox
Гость
« Ответ #8 : Октябрь 06, 2008, 00:41 »

в таком случае прошу задачу целиком - угадывать как должно быть и что не так впредь не намерен!
Внизу должен располагаться логгер системы. Назначение - отображать сообщения системы (не важно какие). При запуске "главного окна" должен занимать минимум места, но должен быть видим. Его размер должен варьироваться. Должен иметь возможность открепляться от главного окна.
В качестве виджета отображения выбран QTextEdit ибо в нем присутствует необходимая для начала функциональность. Позже это будет наследник от QTextEdit.
---
Сделать так что бы он был видим могу. Но происходит что-то странное. Я не могу задать его начальный (предпочтительный) размер. Т/е полиси игнорируются. Единственное что я могу - это задать изначально фиксированный размер. Тогда все получается. Но в таком случае QDockWidget в котором расположен QTextEdit - теряет возможность изменять свой размер (в данном случае по вертикали). 
Конечно наверное можно обойтись и QSplitter... но тогда его (логгер) нельзя будет открепить от основного окна.
---
P.S. Нашел на свою голову приключение. Если бы не требование крос-платворм... ;-)
« Последнее редактирование: Октябрь 06, 2008, 01:02 от covox » Записан
ритт
Гость
« Ответ #9 : Октябрь 06, 2008, 01:13 »

ну, вот, совсем другое дело!
сходу не нашёл соответствующей таски в трекере, но сдаётся мне, какие-то изменения по теме проскакивали не так давно в снапшоте 4.5.0.
советую скачать-собрать 4.5.0-снапшот по-свежее и проверить своё приложение на нём.

в любом случае, до 4.5.0 будет присутствовать ещё один известный баг с незапоминанием размеров доквиджетов при андоке/доке и по рестореГеометри...так что, остаётся только ждать...
« Последнее редактирование: Октябрь 06, 2008, 02:37 от Константин » Записан
covox
Гость
« Ответ #10 : Октябрь 06, 2008, 01:30 »

Завтра попробую посмотреть что там 4.5.
Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.128 секунд. Запросов: 21.