crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> MDI для редактора изображений. Не получается изменить размер Client Area окна документа.
Nikitun
  опции профиля:
сообщение 22.11.2011, 1:19
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 1
Регистрация: 21.11.2011
Пользователь №: 3017

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте! Я относительно недавно взялся за освоение 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.2.2025, 15:42