source: trunk/examples/widgets/icons/mainwindow.cpp@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

File size: 14.0 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation (qt-info@nokia.com)
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at qt-info@nokia.com.
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include <QtGui>
43
44#include "iconpreviewarea.h"
45#include "iconsizespinbox.h"
46#include "imagedelegate.h"
47#include "mainwindow.h"
48
49//! [0]
50MainWindow::MainWindow()
51{
52 centralWidget = new QWidget;
53 setCentralWidget(centralWidget);
54
55 createPreviewGroupBox();
56 createImagesGroupBox();
57 createIconSizeGroupBox();
58
59 createActions();
60 createMenus();
61 createContextMenu();
62
63 QGridLayout *mainLayout = new QGridLayout;
64 mainLayout->addWidget(previewGroupBox, 0, 0, 1, 2);
65 mainLayout->addWidget(imagesGroupBox, 1, 0);
66 mainLayout->addWidget(iconSizeGroupBox, 1, 1);
67 centralWidget->setLayout(mainLayout);
68
69 setWindowTitle(tr("Icons"));
70 checkCurrentStyle();
71 otherRadioButton->click();
72
73 resize(minimumSizeHint());
74}
75//! [0]
76
77//! [1]
78void MainWindow::about()
79{
80 QMessageBox::about(this, tr("About Icons"),
81 tr("The <b>Icons</b> example illustrates how Qt renders an icon in "
82 "different modes (active, normal, disabled, and selected) and "
83 "states (on and off) based on a set of images."));
84}
85//! [1]
86
87//! [2]
88void MainWindow::changeStyle(bool checked)
89{
90 if (!checked)
91 return;
92
93 QAction *action = qobject_cast<QAction *>(sender());
94//! [2] //! [3]
95 QStyle *style = QStyleFactory::create(action->data().toString());
96//! [3] //! [4]
97 Q_ASSERT(style);
98 QApplication::setStyle(style);
99
100 smallRadioButton->setText(tr("Small (%1 x %1)")
101 .arg(style->pixelMetric(QStyle::PM_SmallIconSize)));
102 largeRadioButton->setText(tr("Large (%1 x %1)")
103 .arg(style->pixelMetric(QStyle::PM_LargeIconSize)));
104 toolBarRadioButton->setText(tr("Toolbars (%1 x %1)")
105 .arg(style->pixelMetric(QStyle::PM_ToolBarIconSize)));
106 listViewRadioButton->setText(tr("List views (%1 x %1)")
107 .arg(style->pixelMetric(QStyle::PM_ListViewIconSize)));
108 iconViewRadioButton->setText(tr("Icon views (%1 x %1)")
109 .arg(style->pixelMetric(QStyle::PM_IconViewIconSize)));
110 tabBarRadioButton->setText(tr("Tab bars (%1 x %1)")
111 .arg(style->pixelMetric(QStyle::PM_TabBarIconSize)));
112
113 changeSize();
114}
115//! [4]
116
117//! [5]
118void MainWindow::changeSize(bool checked)
119{
120 if (!checked)
121 return;
122
123 int extent;
124
125 if (otherRadioButton->isChecked()) {
126 extent = otherSpinBox->value();
127 } else {
128 QStyle::PixelMetric metric;
129
130 if (smallRadioButton->isChecked()) {
131 metric = QStyle::PM_SmallIconSize;
132 } else if (largeRadioButton->isChecked()) {
133 metric = QStyle::PM_LargeIconSize;
134 } else if (toolBarRadioButton->isChecked()) {
135 metric = QStyle::PM_ToolBarIconSize;
136 } else if (listViewRadioButton->isChecked()) {
137 metric = QStyle::PM_ListViewIconSize;
138 } else if (iconViewRadioButton->isChecked()) {
139 metric = QStyle::PM_IconViewIconSize;
140 } else {
141 metric = QStyle::PM_TabBarIconSize;
142 }
143 extent = QApplication::style()->pixelMetric(metric);
144 }
145 previewArea->setSize(QSize(extent, extent));
146 otherSpinBox->setEnabled(otherRadioButton->isChecked());
147}
148//! [5]
149
150//! [6]
151void MainWindow::changeIcon()
152{
153 QIcon icon;
154
155 for (int row = 0; row < imagesTable->rowCount(); ++row) {
156 QTableWidgetItem *item0 = imagesTable->item(row, 0);
157 QTableWidgetItem *item1 = imagesTable->item(row, 1);
158 QTableWidgetItem *item2 = imagesTable->item(row, 2);
159
160 if (item0->checkState() == Qt::Checked) {
161 QIcon::Mode mode;
162 if (item1->text() == tr("Normal")) {
163 mode = QIcon::Normal;
164 } else if (item1->text() == tr("Active")) {
165 mode = QIcon::Active;
166 } else if (item1->text() == tr("Disabled")) {
167 mode = QIcon::Disabled;
168 } else {
169 mode = QIcon::Selected;
170 }
171
172 QIcon::State state;
173 if (item2->text() == tr("On")) {
174 state = QIcon::On;
175 } else {
176 state = QIcon::Off;
177//! [6] //! [7]
178 }
179//! [7]
180
181//! [8]
182 QString fileName = item0->data(Qt::UserRole).toString();
183 QImage image(fileName);
184 if (!image.isNull())
185 icon.addPixmap(QPixmap::fromImage(image), mode, state);
186//! [8] //! [9]
187 }
188//! [9] //! [10]
189 }
190//! [10]
191
192//! [11]
193 previewArea->setIcon(icon);
194}
195//! [11]
196
197//! [12]
198void MainWindow::addImages()
199{
200 QStringList fileNames = QFileDialog::getOpenFileNames(this,
201 tr("Open Images"), "",
202 tr("Images (*.png *.xpm *.jpg);;"
203 "All Files (*)"));
204 if (!fileNames.isEmpty()) {
205 foreach (QString fileName, fileNames) {
206 int row = imagesTable->rowCount();
207 imagesTable->setRowCount(row + 1);
208//! [12]
209
210//! [13]
211 QString imageName = QFileInfo(fileName).baseName();
212//! [13] //! [14]
213 QTableWidgetItem *item0 = new QTableWidgetItem(imageName);
214 item0->setData(Qt::UserRole, fileName);
215 item0->setFlags(item0->flags() & ~Qt::ItemIsEditable);
216//! [14]
217
218//! [15]
219 QTableWidgetItem *item1 = new QTableWidgetItem(tr("Normal"));
220//! [15] //! [16]
221 QTableWidgetItem *item2 = new QTableWidgetItem(tr("Off"));
222
223 if (guessModeStateAct->isChecked()) {
224 if (fileName.contains("_act")) {
225 item1->setText(tr("Active"));
226 } else if (fileName.contains("_dis")) {
227 item1->setText(tr("Disabled"));
228 } else if (fileName.contains("_sel")) {
229 item1->setText(tr("Selected"));
230 }
231
232 if (fileName.contains("_on"))
233 item2->setText(tr("On"));
234//! [16] //! [17]
235 }
236//! [17]
237
238//! [18]
239 imagesTable->setItem(row, 0, item0);
240//! [18] //! [19]
241 imagesTable->setItem(row, 1, item1);
242 imagesTable->setItem(row, 2, item2);
243 imagesTable->openPersistentEditor(item1);
244 imagesTable->openPersistentEditor(item2);
245
246 item0->setCheckState(Qt::Checked);
247 }
248 }
249}
250//! [19]
251
252//! [20]
253void MainWindow::removeAllImages()
254{
255 imagesTable->setRowCount(0);
256 changeIcon();
257}
258//! [20]
259
260void MainWindow::createPreviewGroupBox()
261{
262 previewGroupBox = new QGroupBox(tr("Preview"));
263
264 previewArea = new IconPreviewArea;
265
266 QVBoxLayout *layout = new QVBoxLayout;
267 layout->addWidget(previewArea);
268 previewGroupBox->setLayout(layout);
269}
270
271//! [21]
272void MainWindow::createImagesGroupBox()
273{
274 imagesGroupBox = new QGroupBox(tr("Images"));
275
276 imagesTable = new QTableWidget;
277 imagesTable->setSelectionMode(QAbstractItemView::NoSelection);
278 imagesTable->setItemDelegate(new ImageDelegate(this));
279//! [21]
280
281//! [22]
282 QStringList labels;
283//! [22] //! [23]
284 labels << tr("Image") << tr("Mode") << tr("State");
285
286 imagesTable->horizontalHeader()->setDefaultSectionSize(90);
287 imagesTable->setColumnCount(3);
288 imagesTable->setHorizontalHeaderLabels(labels);
289 imagesTable->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch);
290 imagesTable->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
291 imagesTable->horizontalHeader()->setResizeMode(2, QHeaderView::Fixed);
292 imagesTable->verticalHeader()->hide();
293//! [23]
294
295//! [24]
296 connect(imagesTable, SIGNAL(itemChanged(QTableWidgetItem*)),
297//! [24] //! [25]
298 this, SLOT(changeIcon()));
299
300 QVBoxLayout *layout = new QVBoxLayout;
301 layout->addWidget(imagesTable);
302 imagesGroupBox->setLayout(layout);
303}
304//! [25]
305
306//! [26]
307void MainWindow::createIconSizeGroupBox()
308{
309 iconSizeGroupBox = new QGroupBox(tr("Icon Size"));
310
311 smallRadioButton = new QRadioButton;
312 largeRadioButton = new QRadioButton;
313 toolBarRadioButton = new QRadioButton;
314 listViewRadioButton = new QRadioButton;
315 iconViewRadioButton = new QRadioButton;
316 tabBarRadioButton = new QRadioButton;
317 otherRadioButton = new QRadioButton(tr("Other:"));
318
319 otherSpinBox = new IconSizeSpinBox;
320 otherSpinBox->setRange(8, 128);
321 otherSpinBox->setValue(64);
322//! [26]
323
324//! [27]
325 connect(smallRadioButton, SIGNAL(toggled(bool)),
326 this, SLOT(changeSize(bool)));
327 connect(largeRadioButton, SIGNAL(toggled(bool)),
328 this, SLOT(changeSize(bool)));
329 connect(toolBarRadioButton, SIGNAL(toggled(bool)),
330 this, SLOT(changeSize(bool)));
331 connect(listViewRadioButton, SIGNAL(toggled(bool)),
332 this, SLOT(changeSize(bool)));
333 connect(iconViewRadioButton, SIGNAL(toggled(bool)),
334 this, SLOT(changeSize(bool)));
335 connect(tabBarRadioButton, SIGNAL(toggled(bool)),
336 this, SLOT(changeSize(bool)));
337 connect(otherRadioButton, SIGNAL(toggled(bool)),
338 this, SLOT(changeSize(bool)));
339 connect(otherSpinBox, SIGNAL(valueChanged(int)), this, SLOT(changeSize()));
340
341 QHBoxLayout *otherSizeLayout = new QHBoxLayout;
342 otherSizeLayout->addWidget(otherRadioButton);
343 otherSizeLayout->addWidget(otherSpinBox);
344 otherSizeLayout->addStretch();
345
346 QGridLayout *layout = new QGridLayout;
347 layout->addWidget(smallRadioButton, 0, 0);
348 layout->addWidget(largeRadioButton, 1, 0);
349 layout->addWidget(toolBarRadioButton, 2, 0);
350 layout->addWidget(listViewRadioButton, 0, 1);
351 layout->addWidget(iconViewRadioButton, 1, 1);
352 layout->addWidget(tabBarRadioButton, 2, 1);
353 layout->addLayout(otherSizeLayout, 3, 0, 1, 2);
354 layout->setRowStretch(4, 1);
355 iconSizeGroupBox->setLayout(layout);
356}
357//! [27]
358
359//! [28]
360void MainWindow::createActions()
361{
362 addImagesAct = new QAction(tr("&Add Images..."), this);
363 addImagesAct->setShortcut(tr("Ctrl+A"));
364 connect(addImagesAct, SIGNAL(triggered()), this, SLOT(addImages()));
365
366 removeAllImagesAct = new QAction(tr("&Remove All Images"), this);
367 removeAllImagesAct->setShortcut(tr("Ctrl+R"));
368 connect(removeAllImagesAct, SIGNAL(triggered()),
369 this, SLOT(removeAllImages()));
370
371 exitAct = new QAction(tr("&Quit"), this);
372 exitAct->setShortcuts(QKeySequence::Quit);
373 connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));
374
375 styleActionGroup = new QActionGroup(this);
376 foreach (QString styleName, QStyleFactory::keys()) {
377 QAction *action = new QAction(styleActionGroup);
378 action->setText(tr("%1 Style").arg(styleName));
379 action->setData(styleName);
380 action->setCheckable(true);
381 connect(action, SIGNAL(triggered(bool)), this, SLOT(changeStyle(bool)));
382 }
383
384 guessModeStateAct = new QAction(tr("&Guess Image Mode/State"), this);
385 guessModeStateAct->setCheckable(true);
386 guessModeStateAct->setChecked(true);
387
388 aboutAct = new QAction(tr("&About"), this);
389 connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));
390
391 aboutQtAct = new QAction(tr("About &Qt"), this);
392 connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
393}
394//! [28]
395
396//! [29]
397void MainWindow::createMenus()
398{
399 fileMenu = menuBar()->addMenu(tr("&File"));
400 fileMenu->addAction(addImagesAct);
401 fileMenu->addAction(removeAllImagesAct);
402 fileMenu->addSeparator();
403 fileMenu->addAction(exitAct);
404
405 viewMenu = menuBar()->addMenu(tr("&View"));
406 foreach (QAction *action, styleActionGroup->actions())
407 viewMenu->addAction(action);
408 viewMenu->addSeparator();
409 viewMenu->addAction(guessModeStateAct);
410
411 menuBar()->addSeparator();
412
413 helpMenu = menuBar()->addMenu(tr("&Help"));
414 helpMenu->addAction(aboutAct);
415 helpMenu->addAction(aboutQtAct);
416}
417//! [29]
418
419//! [30]
420void MainWindow::createContextMenu()
421{
422 imagesTable->setContextMenuPolicy(Qt::ActionsContextMenu);
423 imagesTable->addAction(addImagesAct);
424 imagesTable->addAction(removeAllImagesAct);
425}
426//! [30]
427
428//! [31]
429void MainWindow::checkCurrentStyle()
430{
431 foreach (QAction *action, styleActionGroup->actions()) {
432 QString styleName = action->data().toString();
433 QStyle *candidate = QStyleFactory::create(styleName);
434 Q_ASSERT(candidate);
435 if (candidate->metaObject()->className()
436 == QApplication::style()->metaObject()->className()) {
437 action->trigger();
438 return;
439 }
440 delete candidate;
441 }
442}
443//! [31]
Note: See TracBrowser for help on using the repository browser.