mainwindow.cpp Example File
demos/mainwindow/mainwindow.cpp
#include "mainwindow.h"
#include "colorswatch.h"
#include "toolbar.h"
#include <QAction>
#include <QLayout>
#include <QMenu>
#include <QMenuBar>
#include <QStatusBar>
#include <QTextEdit>
#include <QFile>
#include <QDataStream>
#include <QFileDialog>
#include <QMessageBox>
#include <QSignalMapper>
#include <QApplication>
#include <qdebug.h>
static const char * const message =
"<p><b>Qt Main Window Demo</b></p>"
"<p>This is a demonstration of the QMainWindow, QToolBar and "
"QDockWidget classes.</p>"
"<p>The tool bar and dock widgets can be dragged around and rearranged "
"using the mouse or via the menu.</p>"
"<p>Each dock widget contains a colored frame and a context "
"(right-click) menu.</p>"
#ifdef Q_WS_MAC
"<p>On Mac OS X, the \"Black\" dock widget has been created as a "
"<em>Drawer</em>, which is a special kind of QDockWidget.</p>"
#endif
;
MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags)
: QMainWindow(parent, flags)
{
setObjectName("MainWindow");
setWindowTitle("Qt Main Window Demo");
setupToolBar();
setupMenuBar();
setupDockWidgets();
QTextEdit *center = new QTextEdit(this);
center->setReadOnly(true);
center->setHtml(tr(message));
center->setMinimumSize(400, 205);
setCentralWidget(center);
statusBar()->showMessage(tr("Status Bar"));
}
void MainWindow::actionTriggered(QAction *action)
{
qDebug("action '%s' triggered", action->text().toLocal8Bit().data());
}
void MainWindow::setupToolBar()
{
toolbar = new ToolBar(this);
toolbar->setAllowedAreas(Qt::TopToolBarArea | Qt::BottomToolBarArea);
addToolBar(toolbar);
}
void MainWindow::setupMenuBar()
{
QMenu *menu = menuBar()->addMenu(tr("&File"));
QAction *action = menu->addAction(tr("Save layout..."));
connect(action, SIGNAL(triggered()), this, SLOT(saveLayout()));
action = menu->addAction(tr("Load layout..."));
connect(action, SIGNAL(triggered()), this, SLOT(loadLayout()));
action = menu->addAction(tr("Switch layout direction"));
connect(action, SIGNAL(triggered()), this, SLOT(switchLayoutDirection()));
menu->addSeparator();
menu->addAction(tr("&Quit"), this, SLOT(close()));
menuBar()->addMenu(toolbar->menu);
dockWidgetMenu = menuBar()->addMenu(tr("&Dock Widgets"));
}
static void dump(const QByteArray &array)
{
QString s;
for (int i = 0; i < array.count(); ++i) {
s += ' ';
s += QString::number((uchar)array.at(i));
}
qDebug() << "dump():" << s;
}
void MainWindow::saveLayout()
{
QString fileName
= QFileDialog::getSaveFileName(this, tr("Save layout"));
if (fileName.isEmpty())
return;
QFile file(fileName);
if (!file.open(QFile::WriteOnly)) {
QString msg = tr("Failed to open %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, tr("Error"), msg);
return;
}
QByteArray geo_data = saveGeometry();
QByteArray layout_data = saveState();
bool ok = file.putChar((uchar)geo_data.size());
if (ok)
ok = file.write(geo_data) == geo_data.size();
if (ok)
ok = file.write(layout_data) == layout_data.size();
if (!ok) {
QString msg = tr("Error writing to %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, tr("Error"), msg);
return;
}
}
void MainWindow::loadLayout()
{
QString fileName
= QFileDialog::getOpenFileName(this, tr("Load layout"));
if (fileName.isEmpty())
return;
QFile file(fileName);
if (!file.open(QFile::ReadOnly)) {
QString msg = tr("Failed to open %1\n%2")
.arg(fileName)
.arg(file.errorString());
QMessageBox::warning(this, tr("Error"), msg);
return;
}
uchar geo_size;
QByteArray geo_data;
QByteArray layout_data;
bool ok = file.getChar((char*)&geo_size);
if (ok) {
geo_data = file.read(geo_size);
ok = geo_data.size() == geo_size;
}
if (ok) {
layout_data = file.readAll();
ok = layout_data.size() > 0;
}
if (ok)
ok = restoreGeometry(geo_data);
if (ok)
ok = restoreState(layout_data);
if (!ok) {
QString msg = tr("Error reading %1")
.arg(fileName);
QMessageBox::warning(this, tr("Error"), msg);
return;
}
}
QAction *addAction(QMenu *menu, const QString &text, QActionGroup *group, QSignalMapper *mapper,
int id)
{
bool first = group->actions().isEmpty();
QAction *result = menu->addAction(text);
result->setCheckable(true);
result->setChecked(first);
group->addAction(result);
QObject::connect(result, SIGNAL(triggered()), mapper, SLOT(map()));
mapper->setMapping(result, id);
return result;
}
void MainWindow::setupDockWidgets()
{
QAction *action = dockWidgetMenu->addAction(tr("Animation"));
action->setCheckable(true);
action->setChecked(isAnimated());
connect(action, SIGNAL(toggled(bool)), this, SLOT(setAnimated(bool)));
action = dockWidgetMenu->addAction(tr("Nesting"));
action->setCheckable(true);
action->setChecked(isDockNestingEnabled());
connect(action, SIGNAL(toggled(bool)), this, SLOT(setDockNestingEnabled(bool)));
dockWidgetMenu->addSeparator();
mapper = new QSignalMapper(this);
connect(mapper, SIGNAL(mapped(int)), this, SLOT(setCorner(int)));
QMenu *corner_menu = dockWidgetMenu->addMenu(tr("Top left corner"));
QActionGroup *group = new QActionGroup(this);
group->setExclusive(true);
::addAction(corner_menu, tr("Top dock area"), group, mapper, 0);
::addAction(corner_menu, tr("Left dock area"), group, mapper, 1);
corner_menu = dockWidgetMenu->addMenu(tr("Top right corner"));
group = new QActionGroup(this);
group->setExclusive(true);
::addAction(corner_menu, tr("Top dock area"), group, mapper, 2);
::addAction(corner_menu, tr("Right dock area"), group, mapper, 3);
corner_menu = dockWidgetMenu->addMenu(tr("Bottom left corner"));
group = new QActionGroup(this);
group->setExclusive(true);
::addAction(corner_menu, tr("Bottom dock area"), group, mapper, 4);
::addAction(corner_menu, tr("Left dock area"), group, mapper, 5);
corner_menu = dockWidgetMenu->addMenu(tr("Bottom right corner"));
group = new QActionGroup(this);
group->setExclusive(true);
::addAction(corner_menu, tr("Bottom dock area"), group, mapper, 6);
::addAction(corner_menu, tr("Right dock area"), group, mapper, 7);
dockWidgetMenu->addSeparator();
static const struct Set {
const char * name;
uint flags;
Qt::DockWidgetArea area;
} sets [] = {
#ifndef Q_WS_MAC
{ "Black", 0, Qt::LeftDockWidgetArea },
#else
{ "Black", Qt::Drawer, Qt::LeftDockWidgetArea },
#endif
{ "White", 0, Qt::RightDockWidgetArea },
{ "Red", 0, Qt::TopDockWidgetArea },
{ "Green", 0, Qt::TopDockWidgetArea },
{ "Blue", 0, Qt::BottomDockWidgetArea },
{ "Yellow", 0, Qt::BottomDockWidgetArea }
};
const int setCount = sizeof(sets) / sizeof(Set);
for (int i = 0; i < setCount; ++i) {
ColorSwatch *swatch = new ColorSwatch(tr(sets[i].name), this, Qt::WindowFlags(sets[i].flags));
if (i%2)
swatch->setWindowIcon(QIcon(QPixmap(":/res/qt.png")));
addDockWidget(sets[i].area, swatch);
dockWidgetMenu->addMenu(swatch->menu);
}
}
void MainWindow::setCorner(int id)
{
switch (id) {
case 0:
QMainWindow::setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea);
break;
case 1:
QMainWindow::setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
break;
case 2:
QMainWindow::setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea);
break;
case 3:
QMainWindow::setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
break;
case 4:
QMainWindow::setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea);
break;
case 5:
QMainWindow::setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
break;
case 6:
QMainWindow::setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea);
break;
case 7:
QMainWindow::setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
break;
}
}
void MainWindow::switchLayoutDirection()
{
if (layoutDirection() == Qt::LeftToRight)
qApp->setLayoutDirection(Qt::RightToLeft);
else
qApp->setLayoutDirection(Qt::LeftToRight);
}