Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Nikitun от Ноябрь 22, 2011, 01:12



Название: Не получается изменить размер Client Area окна документа.
Отправлено: Nikitun от Ноябрь 22, 2011, 01:12
Здравствуйте! Я относительно недавно взялся за освоение Qt, не имея при этом опыта программирования GUI с использованием других библиотек. Недавно возникла необходимость написать MDI для редактора изображений. За основу был взят пример MDi (http://doc.qt.nokia.com/latest/mainwindows-mdi.html), где для чтения/сохранения текстовых файлов и вывода текста в окно документа использовался класс QLabel. И все бы ничего, на большинство вопросов ответы успешно находятся в документации и примерах, но иногда, как сейчас, просто имеет место ступор на ровном месте. Чувствую, что все должно быть просто и логично, но не понимаю как это сделать. Скорее всего, это не последний мой топик на данном форуме, так как я еще в начале разработки. Поэтому очень надеюсь, что не сгенерирую тут килотонны ненависти своими нубскими вопросами. :)

Итак. По задумке изображение, открытое из файла, должно изменять размер Сlient Area окна документа, так, чтобы отображаться в нем полностью (без полос прокрутки), если его размеры не превышают размеры области mdiArea (тут уже либо Fit To Window, либо полосы прокрутки - пока неважно). Так вот, в //??? ... ???// я надеялся изменить размер Client Area окна документа, обращаясь к нему через child->parentWidget() и вызывая его метод resize() (http://doc.crossplatform.ru/qt/4.7.x/application-windows.html). Но такой вызов resize() изменял размер рамки окна документа, изображение при этом сразу после открытия отображалось в нем не полностью. Правда, стоило сдвинуть мышкой окно документа хоть на пиксель, оно растягивалось и начинало корректно отображать загруженную картинку. Подскажите, как в этой ситуации мне правильно изменить размер Client Area окна документа?
Спасибо!


Код:
//Открытие файла.
void MainWindow::open()
{
QString fileName = QFileDialog::getOpenFileName(this); //Открывается файл, сохраняется его полное имя.
if (!fileName.isEmpty()) //Проверка, не является ли полное имя пустой строкой.
{
//Поиск среди открытых файлов файла с таким же полным именем во избежание повторного открытия одного и того же файла.
QMdiSubWindow *existing = findMdiChild(fileName);
if (existing)
{
mdiArea->setActiveSubWindow(existing); //Если файл с таким полным именем уже открыт, его окно становится активным.
return;
}
//Если файлов с полным именем, совпадающим с fileName открыто не было, открывается новое окно документа.
MdiChild *child = createMdiChild(); //Создается окно документа.
if (child->loadFile(fileName))
{
statusBar()->showMessage(tr("File loaded"), 2000);
//???
child->parentWidget()->resize(child->pixmap()->width() < mdiArea->width() ? child->pixmap()->width() : mdiArea->width(),
child->pixmap()->height() < mdiArea->height() ? child->pixmap()->height() : mdiArea->height());
//???
child->show();
}
else
{
child->close();
}
}
}

//Создание окна документа.
MdiChild *MainWindow::createMdiChild()
{
MdiChild *child = new MdiChild;
mdiArea->addSubWindow(child);

connect(child, SIGNAL(copyAvailable(bool)), cutAct, SLOT(setEnabled(bool)));
connect(child, SIGNAL(copyAvailable(bool)), copyAct, SLOT(setEnabled(bool)));

return child;
}

//Класс MdiChild
#ifndef MDICHILD_H
#define MDICHILD_H

#include <QLabel>

class MdiChild : public QLabel
{
Q_OBJECT

public:
MdiChild();

void newFile();
bool loadFile(const QString &fileName);
bool save();
bool saveAs();
bool saveFile(const QString &fileName);
QString userFriendlyCurrentFile();
QString currentFile() { return curFile; }

bool isNew();

protected:
void closeEvent(QCloseEvent *event);

private slots:
void documentWasModified();

private:
bool maybeSave();
void setCurrentFile(const QString &fileName);
QString strippedName(const QString &fullFileName);

QString curFile;
bool isUntitled;
bool isModified;
};

#endif