Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: DmP от Январь 25, 2006, 16:56



Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 25, 2006, 16:56
Qt 4.1 есть класс, который наследует QDockWidget.
Не получается ни в конструкторе, ни в другом месте уменьшить размер QDockWidget при его выводе на экран.

resize() - не дает ни какого эффекта. Может, что не так делаю.
Как можно изменить размер окошка с QDockWidget? =)


Название: програмно не меняется размер у QDockWidget
Отправлено: burunduk от Январь 25, 2006, 17:04
сталкивался с этими неудобствами :(
попробуйте использовать setMaximumSize(), setMaximumWidth(), setMinimumSize() ...


Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 25, 2006, 17:20
Цитата: "burunduk"
сталкивался с этими неудобствами :(
попробуйте использовать setMaximumSize(), setMaximumWidth(), setMinimumSize() ...


Весело получаеться, оказываеться QDockWidget находиться внутри еще одного окна, и если потянуть за линию, то окошечко QDockWidget с кнопочками не изменяеться. =)
Как временный вариант, подходит, но ... =)


Название: програмно не меняется размер у QDockWidget
Отправлено: Steven_Orko от Январь 25, 2006, 18:12
А если у меня два таких объекта: один слева, а другой внизу.  Как мне сделать размер нижнего таким как мне надо при выводе на экран, и при этом чтобы его пользователь мышкой мог изменять?


Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 26, 2006, 09:32
Цитата: "Steven_Orko"
А если у меня два таких объекта: один слева, а другой внизу.  Как мне сделать размер нижнего таким как мне надо при выводе на экран, и при этом чтобы его пользователь мышкой мог изменять?


По ходу надо получить класс QRubberBand на котором и лежит QDockWidget, но QMainWindow - его отдаватть по документации не хочет. =(
Видемо это баг Qt 4.1 =)


Название: програмно не меняется размер у QDockWidget
Отправлено: Racheengel от Январь 26, 2006, 11:04
этот баг еще с 3.3 тянецца :(


Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 26, 2006, 12:08
Цитата: "Racheengel"
этот баг еще с 3.3 тянецца :(


 :)

Попробывал покапаться в исходниках, там используються QDockWidgetLayout, QDockSeparator, QDockWidgetSeparator, QMainWindowLayout, но все настолько запутанно, что решил забить на это. =)


Название: програмно не меняется размер у QDockWidget
Отправлено: Steven_Orko от Январь 26, 2006, 12:58
А может кто-нибудь перевести этот вопрос по попводу программного изменения размеров QDockWidget на английский? Я его отошлю троллям. У меня там техподдержка есть зарегистрированная. Или им можна так по-русски писать? ))) Как получу ответ, сразу здесь выложу в этой теме.


Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 26, 2006, 14:22
Цитата: "Steven_Orko"
А может кто-нибудь перевести этот вопрос по попводу программного изменения размеров QDockWidget на английский? Я его отошлю троллям. У меня там техподдержка есть зарегистрированная. Или им можна так по-русски писать? ))) Как получу ответ, сразу здесь выложу в этой теме.


Можно, просто:

Method QDockWidget::resize() not working. Please answer, how change size docked window from program?

Но я в английском не силен. :(

И я также лазил по английскому форуму и по официальной рассылке Qt, ни где на подобные вопросы вообще не отвечали. Мне еще повезло, что мне посоветовали установить, минимальный и максимальный размер. :) Кстати, спасибо. :)


Название: програмно не меняется размер у QDockWidget
Отправлено: Racheengel от Январь 26, 2006, 15:48
Method QDockWidget::resize() does not work. Please answer, how to change the size of the docked window from a program?


Название: програмно не меняется размер у QDockWidget
Отправлено: Steven_Orko от Январь 26, 2006, 15:55
Вот первый ответ:
Цитировать


Is that dock widget docked or floating? Note that you can in general not
resize a widget that lives in a layout programmatically - that's the
layout's job, after all.



Название: програмно не меняется размер у QDockWidget
Отправлено: Racheengel от Январь 26, 2006, 16:02
хм.. чего-то они видать недопоняли... какой layout, если надо размер придоченного окна поменять... лучше спросить ИМХО так:

The problem is the following. When my application is about to be closed, it saves the geometry parameters of all the docked and floating windows. But on the next start, while restoring, these windows could not be setted up with the saved geometries, they're using default geometry. How should I set up geometry correctly?


Название: програмно не меняется размер у QDockWidget
Отправлено: Steven_Orko от Январь 26, 2006, 17:06
Они попросили пример небольшой, где я пытаюсь делать то, что мне надо. Я им отправил проект, где просто в конструкторе пытаюсь установить высоту окна, пристыкованного вниз.


Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 26, 2006, 17:32
Цитата: "Steven_Orko"
Они попросили пример небольшой, где я пытаюсь делать то, что мне надо. Я им отправил проект, где просто в конструкторе пытаюсь установить высоту окна, пристыкованного вниз.


Если еще нужно, но здесь не весь код. =) Не хватает описания MainWnd.

Код:

#include <QDockWidget>

class QTextEdit;
class QCloseEvent;

class MessageWindow : public QDockWidget
{
Q_OBJECT;

public:
MessageWindow(QWidget *parent = 0);

// Статические функции
static void Message(QString Msg, QString Marker="");
static void Clear();
static void Close();

static MessageWindow* m_msgWin;

private:
//static MessageWindow* m_msgWin;
QTextEdit *m_text;

void closeEvent(QCloseEvent *e);
};


Код:

#include "app/message_window.h"

#include <QTextEdit>
#include <QMainWindow>

MessageWindow* MessageWindow::m_msgWin = 0;

MessageWindow::MessageWindow(QWidget *parent)
: QDockWidget(parent)
{
setAllowedAreas(Qt::BottomDockWidgetArea);
setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable);

m_text = new QTextEdit(this);
m_text->setReadOnly(true);

setWidget(m_text);

QSize sz = size();
sz.setHeight(100);  << ----- Does not work
resize(sz);

}

void MessageWindow::Message(QString Msg, QString Marker)
{
if (!m_msgWin)
{
m_msgWin = new MessageWindow(MainWnd);
MainWnd->addDockWidget(Qt::BottomDockWidgetArea, m_msgWin);
}
m_msgWin->m_text->append(Msg);
}

void MessageWindow::Clear()
{
if (m_msgWin)
{
m_msgWin->m_text->clear();
}
}

void MessageWindow::Close()
{
if (m_msgWin)
{
m_msgWin->close();
m_msgWin = 0;
}
}

void MessageWindow::closeEvent(QCloseEvent *e)
{
m_msgWin = 0;
}


Название: програмно не меняется размер у QDockWidget
Отправлено: Steven_Orko от Январь 26, 2006, 21:43
to DmP:
Спасибо за код, ответа пока нет.
Слушай, а мож тебе в деструкторе  m_msgWin обнулять лучше?

добавлено спустя 4 часа 1 минуту:

 Есть хорошие новости!!! Получен ответ от техподдержки троллей. Код, который они написали действительно работает и он НАСТОЛЬКО ПРОСТ, прям до немогу ))))) Ладно, томить не буду, вот сам текст письма:
Цитировать

You cannot resize a widget that is managed by a layout, but you can tell
the layout how large you would like your widget to be. To do that,
reimplement QWidget::sizeHint(), i.e.

Код:
class CMyDock2: public QDockWidget
{
    Q_OBJECT
public:
    CMyDock2(const QString & title, QWidget * parent = 0, Qt::WFlags
flags = 0);
    ~CMyDock2() {};

    QSize sizeHint() const
    {
        QSize sh = QDockWidget::sizeHint();
        sh.setHeight(40);
        return sh;
    }
};

to ALL:
Добавляем, исправляем и радуемся!!! :D

добавлено спустя 5 минут:

 to DmP:
Думаю, тебе эта штука поможет ))))Удачи!!


Название: програмно не меняется размер у QDockWidget
Отправлено: DmP от Январь 27, 2006, 09:56
Цитата: "Steven_Orko"
to DmP:
Спасибо за код, ответа пока нет.
Слушай, а мож тебе в деструкторе  m_msgWin обнулять лучше?

Да можно, я об этом не подумал. :)

Цитата: "Steven_Orko"

 to DmP:
Думаю, тебе эта штука поможет ))))Удачи!!

Огромное Спасибо! Работает!!!  :D