Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/46: Рейтинг темы: голосов - 46, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 13

Вывод изображения на форму

11.05.2013, 12:55. Показов 8592. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Столкнулся с необходимостью вывести нарисованное программой изображение (схемку, график) на форму. Специальных элементов для этого я не нашел, а в label просматривать изображение не так удобно. Поискал по примерам и нашел идеальное решение: в imageViewer был удобный просмотрщик, сделанный из label и scrollArea. Но не могу перевести код в свою программу. Подскажите пожалуйста, какие конкретно элементы важны для создания подобного окошка. Вот код самого примера:

Main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <QApplication>
 
#include "imageviewer.h"
 
int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    ImageViewer imageViewer;
#if defined(Q_OS_SYMBIAN)
    imageViewer.showMaximized();
#else
    imageViewer.show();
#endif
    return app.exec();
}
imageviewer.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#ifndef IMAGEVIEWER_H
#define IMAGEVIEWER_H
 
#include <QMainWindow>
#include <QPrinter>
 
QT_BEGIN_NAMESPACE
class QAction;
class QLabel;
class QMenu;
class QScrollArea;
class QScrollBar;
QT_END_NAMESPACE
 
//! [0]
class ImageViewer : public QMainWindow
{
    Q_OBJECT
 
public:
    ImageViewer();
 
private slots:
    void open();
    void print();
    void zoomIn();
    void zoomOut();
    void normalSize();
    void fitToWindow();
    void about();
 
private:
    void createActions();
    void createMenus();
    void updateActions();
    void scaleImage(double factor);
    void adjustScrollBar(QScrollBar *scrollBar, double factor);
 
    QLabel *imageLabel;
    QScrollArea *scrollArea;
    double scaleFactor;
 
#ifndef QT_NO_PRINTER
    QPrinter printer;
#endif
 
    QAction *openAct;
    QAction *printAct;
    QAction *exitAct;
    QAction *zoomInAct;
    QAction *zoomOutAct;
    QAction *normalSizeAct;
    QAction *fitToWindowAct;
    QAction *aboutAct;
    QAction *aboutQtAct;
 
    QMenu *fileMenu;
    QMenu *viewMenu;
    QMenu *helpMenu;
};
//! [0]
 
#endif
imageviewer.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include <QtGui>
 
#include "imageviewer.h"
 
//! [0]
ImageViewer::ImageViewer()
{
    imageLabel = new QLabel;
    imageLabel->setBackgroundRole(QPalette::Base);
    imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    imageLabel->setScaledContents(true);
 
    scrollArea = new QScrollArea;
    scrollArea->setBackgroundRole(QPalette::Dark);
    scrollArea->setWidget(imageLabel);
    setCentralWidget(scrollArea);
 
    createActions();
    createMenus();
 
    setWindowTitle(tr("Image Viewer"));
    resize(500, 400);
}
//! [0]
 
//! [1]
void ImageViewer::open()
//! [1] //! [2]
{
    QString fileName = QFileDialog::getOpenFileName(this,
                                    tr("Open File"), QDir::currentPath());
    if (!fileName.isEmpty()) {
        QImage image(fileName);
        if (image.isNull()) {
            QMessageBox::information(this, tr("Image Viewer"),
                                     tr("Cannot load %1.").arg(fileName));
            return;
        }
//! [2] //! [3]
        imageLabel->setPixmap(QPixmap::fromImage(image));
//! [3] //! [4]
        scaleFactor = 1.0;
 
        printAct->setEnabled(true);
        fitToWindowAct->setEnabled(true);
        updateActions();
 
        if (!fitToWindowAct->isChecked())
            imageLabel->adjustSize();
    }
}
//! [4]
 
//! [5]
void ImageViewer::print()
//! [5] //! [6]
{
    Q_ASSERT(imageLabel->pixmap());
#ifndef QT_NO_PRINTER
//! [6] //! [7]
    QPrintDialog dialog(&printer, this);
//! [7] //! [8]
    if (dialog.exec()) {
        QPainter painter(&printer);
        QRect rect = painter.viewport();
        QSize size = imageLabel->pixmap()->size();
        size.scale(rect.size(), Qt::KeepAspectRatio);
        painter.setViewport(rect.x(), rect.y(), size.width(), size.height());
        painter.setWindow(imageLabel->pixmap()->rect());
        painter.drawPixmap(0, 0, *imageLabel->pixmap());
    }
#endif
}
//! [8]
 
//! [9]
void ImageViewer::zoomIn()
//! [9] //! [10]
{
    scaleImage(1.25);
}
 
void ImageViewer::zoomOut()
{
    scaleImage(0.8);
}
 
//! [10] //! [11]
void ImageViewer::normalSize()
//! [11] //! [12]
{
    imageLabel->adjustSize();
    scaleFactor = 1.0;
}
//! [12]
 
//! [13]
void ImageViewer::fitToWindow()
//! [13] //! [14]
{
    bool fitToWindow = fitToWindowAct->isChecked();
    scrollArea->setWidgetResizable(fitToWindow);
    if (!fitToWindow) {
        normalSize();
    }
    updateActions();
}
//! [14]
 
 
//! [15]
void ImageViewer::about()
//! [15] //! [16]
{
    QMessageBox::about(this, tr("About Image Viewer"),
            tr("<p>The <b>Image Viewer</b> example shows how to combine QLabel "
               "and QScrollArea to display an image. QLabel is typically used "
               "for displaying a text, but it can also display an image. "
               "QScrollArea provides a scrolling view around another widget. "
               "If the child widget exceeds the size of the frame, QScrollArea "
               "automatically provides scroll bars. </p><p>The example "
               "demonstrates how QLabel's ability to scale its contents "
               "(QLabel::scaledContents), and QScrollArea's ability to "
               "automatically resize its contents "
               "(QScrollArea::widgetResizable), can be used to implement "
               "zooming and scaling features. </p><p>In addition the example "
               "shows how to use QPainter to print an image.</p>"));
}
//! [16]
 
//! [17]
void ImageViewer::createActions()
//! [17] //! [18]
{
    openAct = new QAction(tr("&Open..."), this);
    openAct->setShortcut(tr("Ctrl+O"));
    connect(openAct, SIGNAL(triggered()), this, SLOT(open()));
 
    printAct = new QAction(tr("&Print..."), this);
    printAct->setShortcut(tr("Ctrl+P"));
    printAct->setEnabled(false);
    connect(printAct, SIGNAL(triggered()), this, SLOT(print()));
 
    exitAct = new QAction(tr("E&xit"), this);
    exitAct->setShortcut(tr("Ctrl+Q"));
    connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
 
    zoomInAct = new QAction(tr("Zoom &In (25%)"), this);
    zoomInAct->setShortcut(tr("Ctrl++"));
    zoomInAct->setEnabled(false);
    connect(zoomInAct, SIGNAL(triggered()), this, SLOT(zoomIn()));
 
    zoomOutAct = new QAction(tr("Zoom &Out (25%)"), this);
    zoomOutAct->setShortcut(tr("Ctrl+-"));
    zoomOutAct->setEnabled(false);
    connect(zoomOutAct, SIGNAL(triggered()), this, SLOT(zoomOut()));
 
    normalSizeAct = new QAction(tr("&Normal Size"), this);
    normalSizeAct->setShortcut(tr("Ctrl+S"));
    normalSizeAct->setEnabled(false);
    connect(normalSizeAct, SIGNAL(triggered()), this, SLOT(normalSize()));
 
    fitToWindowAct = new QAction(tr("&Fit to Window"), this);
    fitToWindowAct->setEnabled(false);
    fitToWindowAct->setCheckable(true);
    fitToWindowAct->setShortcut(tr("Ctrl+F"));
    connect(fitToWindowAct, SIGNAL(triggered()), this, SLOT(fitToWindow()));
 
    aboutAct = new QAction(tr("&About"), this);
    connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
 
    aboutQtAct = new QAction(tr("About &Qt"), this);
    connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
}
//! [18]
 
//! [19]
void ImageViewer::createMenus()
//! [19] //! [20]
{
    fileMenu = new QMenu(tr("&File"), this);
    fileMenu->addAction(openAct);
    fileMenu->addAction(printAct);
    fileMenu->addSeparator();
    fileMenu->addAction(exitAct);
 
    viewMenu = new QMenu(tr("&View"), this);
    viewMenu->addAction(zoomInAct);
    viewMenu->addAction(zoomOutAct);
    viewMenu->addAction(normalSizeAct);
    viewMenu->addSeparator();
    viewMenu->addAction(fitToWindowAct);
 
    helpMenu = new QMenu(tr("&Help"), this);
    helpMenu->addAction(aboutAct);
    helpMenu->addAction(aboutQtAct);
 
    menuBar()->addMenu(fileMenu);
    menuBar()->addMenu(viewMenu);
    menuBar()->addMenu(helpMenu);
}
//! [20]
 
//! [21]
void ImageViewer::updateActions()
//! [21] //! [22]
{
    zoomInAct->setEnabled(!fitToWindowAct->isChecked());
    zoomOutAct->setEnabled(!fitToWindowAct->isChecked());
    normalSizeAct->setEnabled(!fitToWindowAct->isChecked());
}
//! [22]
 
//! [23]
void ImageViewer::scaleImage(double factor)
//! [23] //! [24]
{
    Q_ASSERT(imageLabel->pixmap());
    scaleFactor *= factor;
    imageLabel->resize(scaleFactor * imageLabel->pixmap()->size());
 
    adjustScrollBar(scrollArea->horizontalScrollBar(), factor);
    adjustScrollBar(scrollArea->verticalScrollBar(), factor);
 
    zoomInAct->setEnabled(scaleFactor < 3.0);
    zoomOutAct->setEnabled(scaleFactor > 0.333);
}
//! [24]
 
//! [25]
void ImageViewer::adjustScrollBar(QScrollBar *scrollBar, double factor)
//! [25] //! [26]
{
    scrollBar->setValue(int(factor * scrollBar->value()
                            + ((factor - 1) * scrollBar->pageStep()/2)));
}
Такие вещи, как открытие файла и печать совсем не нужны. Подозреваю, что самый необходимый код для создания такого окна находится в конструкторе и в функции open(). Вот только не могу понять какие конкретно команды нужны, если учесть, что я создаю label и scrollArea не вручную, а вытаскиваю на форму. Заранее спасибо за помощь.

Добавлено через 1 час 17 минут
В итоге имею форму с scrollArea, внутри которого сидит labelImage. При нажатии на кнопку производится следующий код:

C++
1
2
3
4
5
6
7
8
9
    ui->labelImage->setBackgroundRole(QPalette::Base);
    ui->labelImage->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    ui->scrollArea->setBackgroundRole(QPalette::Dark);
    QPixmap pict(1200,1200); //Картинка для теста
    QPainter x(&pict);
    x.setBrush(Qt::red);
    x.drawRect(0,0,1200,1200);
    x.drawLine(200,200,600,600);
    ui->labelImage->setPixmap(pict);
Изображение на label выводится, отображается ровно та область, которая видна в scrollArea, но вот полос прокрутки нет. Подскажите плиз, что еще нужно добавить для нормальной работы
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.05.2013, 12:55
Ответы с готовыми решениями:

Вывод изображения на форму в label
Всем привет! Подскажите такую вещь, вывожу картинку в лейбл, так: QString filename1 = &quot;/home/user/kote.jpg&quot;; QImage...

Вывод изображения на форму
Умные люди подскажите пожалуйста мне как выводить изображение на форму, по выбранному номеру из выпадающего списка. Я сделала как в...

Вывод изображения с видеорегистратора на форму
Добрый день! Подскажите как на форму вывести например 3 камеры с сетевого аналогового регистратора?

5
Linux-оид
 Аватар для OLLEGATOR
120 / 69 / 9
Регистрация: 15.02.2011
Сообщений: 374
11.05.2013, 18:39
можно QGraphicsScene использовать в связке с QGraphicsView там по умолчанию есть то что тебе нужно... она и предназначена для вывода диаграмм и графических объектов...в будущем если понадобиться то можно манипулировать объектами внутри ней... ну а в твоём примере похоже нужно наследовать QAbstractScrollArea

// в Qt виджеты а не формы
1
0 / 0 / 0
Регистрация: 01.03.2013
Сообщений: 13
11.05.2013, 19:32  [ТС]
Цитата Сообщение от OLLEGATOR Посмотреть сообщение
можно QGraphicsScene использовать в связке с QGraphicsView там по умолчанию есть то что тебе нужно... она и предназначена для вывода диаграмм и графических объектов...в будущем если понадобиться то можно манипулировать объектами внутри ней... ну а в твоём примере похоже нужно наследовать QAbstractScrollArea

// в Qt виджеты а не формы
Спасибо, сам недавно решил попробовать использовать GraphicsView, хоть и струдом, но дотумкал, как отобразить там рисунок. Даже с зумом. Удобно
0
Linux-оид
 Аватар для OLLEGATOR
120 / 69 / 9
Регистрация: 15.02.2011
Сообщений: 374
11.05.2013, 20:02
правильно что решили ...а кнопочка спасибо на форуме есть)
1
41 / 32 / 12
Регистрация: 15.04.2013
Сообщений: 389
12.07.2013, 11:40
Цитата Сообщение от Xoradrik Посмотреть сообщение
Спасибо, сам недавно решил попробовать использовать GraphicsView, хоть и струдом, но дотумкал, как отобразить там рисунок. Даже с зумом. Удобно
не поделитесь как?
0
Linux-оид
 Аватар для OLLEGATOR
120 / 69 / 9
Регистрация: 15.02.2011
Сообщений: 374
13.07.2013, 01:05
QGraphicsItem -> setScaleAt(изначально,конечный результат):
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2013, 01:05
Помогаю со студенческими работами здесь

Загрузка и вывод изображения на форму
Имеется главная форма, на которой будут выводится разные изображения. Изображения решил выводить в отдельном классе. В классе динамически...

Добавление и вывод изображения в/из БД MySQL на форму
Может кто поможет мне в добавлении изображения в БД(и вообще как создать поле отвечающее за изображении в БД) и его вывода на форму,...

Вывод изображения на форму по пути из TextBox
вывод изображения на форму при помоши текст бокса, чтобы ввести на форму адрес расположении картинки и картинка появилась ?

Вывод изображения из базы данных из таблицы в отдельную форму
У меня в программе выводится таблица с отдельной кнопкой для просмотра фото. При нажатии должна открываться новая форма с...

Вывод изображения поверх другого изображения
Привет, как правильнее сделать такую манипуляцию нужно на картинке вывести справа вверху КРАСНЫЙ КРУГ как на изображении которое...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru