Здравствуйте! Я относительно недавно взялся за освоение 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