mainwindow.cpp
来自「奇趣公司比较新的qt/emd版本」· C++ 代码 · 共 426 行
CPP
426 行
/******************************************************************************** Copyright (C) 2006-2007 Trolltech ASA. All rights reserved.**** This file is part of the example classes of the Qt Toolkit.**** This file may be used under the terms of the GNU General Public** License version 2.0 as published by the Free Software Foundation** and appearing in the file LICENSE.GPL included in the packaging of** this file. Please review the following information to ensure GNU** General Public Licensing requirements will be met:** http://trolltech.com/products/qt/licenses/licensing/opensource/**** If you are unsure which license is appropriate for your use, please** review the following information:** http://trolltech.com/products/qt/licenses/licensing/licensingoverview** or contact the sales department at sales@trolltech.com.**** In addition, as a special exception, Trolltech gives you certain** additional rights. These rights are described in the Trolltech GPL** Exception version 1.0, which can be found at** http://www.trolltech.com/products/qt/gplexception/ and in the file** GPL_EXCEPTION.txt in this package.**** In addition, as a special exception, Trolltech, as the sole copyright** holder for Qt Designer, grants users of the Qt/Eclipse Integration** plug-in the right for the Qt/Eclipse Integration to link to** functionality provided by Qt Designer and its related libraries.**** Trolltech reserves all rights not expressly granted herein.**** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.******************************************************************************/#include "mainwindow.h"#include "dialog.h"#include <QtGui>#include <QtSql>#include <QtXml>extern int uniqueAlbumId;extern int uniqueArtistId;MainWindow::MainWindow(const QString &artistTable, const QString &albumTable, QFile *albumDetails, QWidget *parent) : QMainWindow(parent){ file = albumDetails; readAlbumData(); model = new QSqlRelationalTableModel(this); model->setTable(albumTable); model->setRelation(2, QSqlRelation(artistTable, "id", "artist")); model->select(); QGroupBox *artists = createArtistGroupBox(); QGroupBox *albums = createAlbumGroupBox(); QGroupBox *details = createDetailsGroupBox(); artistView->setCurrentIndex(0); uniqueAlbumId = model->rowCount(); uniqueArtistId = artistView->count(); connect(model, SIGNAL(rowsInserted(QModelIndex, int, int)), this, SLOT(updateHeader(QModelIndex, int, int))); connect(model, SIGNAL(rowsRemoved(QModelIndex, int, int)), this, SLOT(updateHeader(QModelIndex, int, int))); QGridLayout *layout = new QGridLayout; layout->addWidget(artists, 0, 0); layout->addWidget(albums, 1, 0); layout->addWidget(details, 0, 1, 2, 1); layout->setColumnStretch(1, 1); layout->setColumnMinimumWidth(0, 500); QWidget *widget = new QWidget; widget->setLayout(layout); setCentralWidget(widget); createMenuBar(); showImageLabel(); resize(850, 400); setWindowTitle(tr("Music Archive"));}void MainWindow::changeArtist(int row){ if (row > 0) { QModelIndex index = model->relationModel(2)->index(row, 1); model->setFilter("artist = '" + index.data().toString() + "'") ; showArtistProfile(index); } else if (row == 0) { model->setFilter(""); showImageLabel(); } else { return; }}void MainWindow::showArtistProfile(QModelIndex index){ QSqlRecord record = model->relationModel(2)->record(index.row()); QString name = record.value("artist").toString(); QString count = record.value("albumcount").toString(); profileLabel->setText(tr("Artist : %1 \n" \ "Number of Albums: %2").arg(name).arg(count)); profileLabel->show(); iconLabel->show(); titleLabel->hide(); trackList->hide(); imageLabel->hide();}void MainWindow::showAlbumDetails(QModelIndex index){ QSqlRecord record = model->record(index.row()); QString artist = record.value("artist").toString(); QString title = record.value("title").toString(); QString year = record.value("year").toString(); QString albumId = record.value("albumid").toString(); showArtistProfile(indexOfArtist(artist)); titleLabel->setText(tr("Title: %1 (%2)").arg(title).arg(year)); titleLabel->show(); QDomNodeList albums = albumData.elementsByTagName("album"); for (int i = 0; i < albums.count(); i++) { QDomNode album = albums.item(i); if (album.toElement().attribute("id") == albumId) { getTrackList(album.toElement()); break; } } if (!trackList->count() == 0) trackList->show();}void MainWindow::getTrackList(QDomNode album){ trackList->clear(); QDomNodeList tracks = album.childNodes(); QDomNode track; QString trackNumber; for (int j = 0; j < tracks.count(); j++) { track = tracks.item(j); trackNumber = track.toElement().attribute("number"); QListWidgetItem *item = new QListWidgetItem(trackList); item->setText(trackNumber + ": " + track.toElement().text()); }}void MainWindow::addAlbum(){ Dialog *dialog = new Dialog(model, albumData, file, this); int accepted = dialog->exec(); if (accepted == 1) { int lastRow = model->rowCount() - 1; albumView->selectRow(lastRow); albumView->scrollToBottom(); showAlbumDetails(model->index(lastRow, 0)); }}void MainWindow::deleteAlbum(){ QModelIndexList selection = albumView->selectionModel()->selectedRows(0); if (!selection.empty()) { QModelIndex idIndex = selection.at(0); int id = idIndex.data().toInt(); QString title = idIndex.sibling(idIndex.row(), 1).data().toString(); QString artist = idIndex.sibling(idIndex.row(), 2).data().toString(); QMessageBox::StandardButton button; button = QMessageBox::question(this, tr("Delete Album"), QString(tr("Are you sure you want to " \ "delete '%1' by '%2'?")) .arg(title).arg(artist), QMessageBox::Yes | QMessageBox::No); if (button == QMessageBox::Yes) { removeAlbumFromFile(id); removeAlbumFromDatabase(idIndex); decreaseAlbumCount(indexOfArtist(artist)); showImageLabel(); } } else { QMessageBox::information(this, tr("Delete Album"), tr("Select the album you want to delete.")); }}void MainWindow::removeAlbumFromFile(int id){ QDomNodeList albums = albumData.elementsByTagName("album"); for (int i = 0; i < albums.count(); i++) { QDomNode node = albums.item(i); if (node.toElement().attribute("id").toInt() == id) { albumData.elementsByTagName("archive").item(0).removeChild(node); break; } }/* The following code is commented out since the example uses an in memory database, i.e., altering the XML file will bring the data out of sync. if (!file->open(QIODevice::WriteOnly)) { return; } else { QTextStream stream(file); albumData.elementsByTagName("archive").item(0).save(stream, 4); file->close(); }*/}void MainWindow::removeAlbumFromDatabase(QModelIndex index){ model->removeRow(index.row());}void MainWindow::decreaseAlbumCount(QModelIndex artistIndex){ int row = artistIndex.row(); QModelIndex albumCountIndex = artistIndex.sibling(row, 2); int albumCount = albumCountIndex.data().toInt(); QSqlTableModel *artists = model->relationModel(2); if (albumCount == 1) { artists->removeRow(row); showImageLabel(); } else { artists->setData(albumCountIndex, QVariant(albumCount - 1)); }}void MainWindow::readAlbumData(){ if (!file->open(QIODevice::ReadOnly)) return; if (!albumData.setContent(file)) { file->close(); return; } file->close();}QGroupBox* MainWindow::createArtistGroupBox(){ artistView = new QComboBox; artistView->setModel(model->relationModel(2)); artistView->setModelColumn(1); connect(artistView, SIGNAL(currentIndexChanged(int)), this, SLOT(changeArtist(int))); QGroupBox *box = new QGroupBox(tr("Artist")); QGridLayout *layout = new QGridLayout; layout->addWidget(artistView, 0, 0); box->setLayout(layout); return box;}QGroupBox* MainWindow::createAlbumGroupBox(){ QGroupBox *box = new QGroupBox(tr("Album")); albumView = new QTableView; albumView->setEditTriggers(QAbstractItemView::NoEditTriggers); albumView->setSortingEnabled(true); albumView->setSelectionBehavior(QAbstractItemView::SelectRows); albumView->setSelectionMode(QAbstractItemView::SingleSelection); albumView->setShowGrid(false); albumView->verticalHeader()->hide(); albumView->setAlternatingRowColors(true); albumView->setModel(model); adjustHeader(); QLocale locale = albumView->locale(); locale.setNumberOptions(QLocale::OmitGroupSeparator); albumView->setLocale(locale); connect(albumView, SIGNAL(clicked(QModelIndex)), this, SLOT(showAlbumDetails(QModelIndex))); connect(albumView, SIGNAL(activated(QModelIndex)), this, SLOT(showAlbumDetails(QModelIndex))); QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(albumView, 0, 0); box->setLayout(layout); return box;}QGroupBox* MainWindow::createDetailsGroupBox(){ QGroupBox *box = new QGroupBox(tr("Details")); profileLabel = new QLabel; profileLabel->setWordWrap(true); profileLabel->setAlignment(Qt::AlignBottom); titleLabel = new QLabel; titleLabel->setWordWrap(true); titleLabel->setAlignment(Qt::AlignBottom); iconLabel = new QLabel(); iconLabel->setAlignment(Qt::AlignBottom | Qt::AlignRight); iconLabel->setPixmap(QPixmap(":/images/icon.png")); imageLabel = new QLabel; imageLabel->setWordWrap(true); imageLabel->setAlignment(Qt::AlignCenter); imageLabel->setPixmap(QPixmap(":/images/image.png")); trackList = new QListWidget; QGridLayout *layout = new QGridLayout; layout->addWidget(imageLabel, 0, 0, 3, 2); layout->addWidget(profileLabel, 0, 0); layout->addWidget(iconLabel, 0, 1); layout->addWidget(titleLabel, 1, 0, 1, 2); layout->addWidget(trackList, 2, 0, 1, 2); layout->setRowStretch(2, 1); box->setLayout(layout); return box;}void MainWindow::createMenuBar(){ QAction *addAction = new QAction(tr("&Add album..."), this); QAction *deleteAction = new QAction(tr("&Delete album..."), this); QAction *quitAction = new QAction(tr("&Quit"), this); QAction *aboutAction = new QAction(tr("&About"), this); QAction *aboutQtAction = new QAction(tr("About &Qt"), this); addAction->setShortcut(tr("Ctrl+A")); deleteAction->setShortcut(tr("Ctrl+D")); quitAction->setShortcut(tr("Ctrl+Q")); QMenu *fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(addAction); fileMenu->addAction(deleteAction); fileMenu->addSeparator(); fileMenu->addAction(quitAction); QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAction); helpMenu->addAction(aboutQtAction); connect(addAction, SIGNAL(triggered(bool)), this, SLOT(addAlbum())); connect(deleteAction, SIGNAL(triggered(bool)), this, SLOT(deleteAlbum())); connect(quitAction, SIGNAL(triggered(bool)), this, SLOT(close())); connect(aboutAction, SIGNAL(triggered(bool)), this, SLOT(about())); connect(aboutQtAction, SIGNAL(triggered(bool)), qApp, SLOT(aboutQt()));}void MainWindow::showImageLabel(){ profileLabel->hide(); titleLabel->hide(); iconLabel->hide(); trackList->hide(); imageLabel->show();}QModelIndex MainWindow::indexOfArtist(const QString &artist){ QSqlTableModel *artistModel = model->relationModel(2); for (int i = 0; i < artistModel->rowCount(); i++) { QSqlRecord record = artistModel->record(i); if (record.value("artist") == artist) return artistModel->index(i, 1); } return QModelIndex();}void MainWindow::updateHeader(QModelIndex, int, int){ adjustHeader();}void MainWindow::adjustHeader(){ albumView->hideColumn(0); albumView->horizontalHeader()->setResizeMode(1, QHeaderView::Stretch); albumView->resizeColumnToContents(2); albumView->resizeColumnToContents(3);}void MainWindow::about(){ QMessageBox::about(this, tr("About Music Archive"), tr("<p>The <b>Music Archive</b> example shows how to present " "data from different data sources in the same application. " "The album titles, and the corresponding artists and release dates, " "are kept in a database, while each album's tracks are stored " "in an XML file. </p><p>The example also shows how to add as " "well as remove data from both the database and the " "associated XML file using the API provided by the QtSql and " "QtXml modules, respectively.</p>"));}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?