mirror of
https://github.com/crystalidea/qt6windows7.git
synced 2025-07-02 15:26:00 +08:00
qt 6.5.1 original
This commit is contained in:
41
examples/widgets/itemviews/addressbook/CMakeLists.txt
Normal file
41
examples/widgets/itemviews/addressbook/CMakeLists.txt
Normal file
@ -0,0 +1,41 @@
|
||||
# Copyright (C) 2022 The Qt Company Ltd.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
project(addressbook LANGUAGES CXX)
|
||||
|
||||
if(NOT DEFINED INSTALL_EXAMPLESDIR)
|
||||
set(INSTALL_EXAMPLESDIR "examples")
|
||||
endif()
|
||||
|
||||
set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/widgets/itemviews/addressbook")
|
||||
|
||||
find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets)
|
||||
|
||||
qt_standard_project_setup()
|
||||
|
||||
qt_add_executable(addressbook
|
||||
adddialog.cpp adddialog.h
|
||||
addresswidget.cpp addresswidget.h
|
||||
main.cpp
|
||||
mainwindow.cpp mainwindow.h
|
||||
newaddresstab.cpp newaddresstab.h
|
||||
tablemodel.cpp tablemodel.h
|
||||
)
|
||||
|
||||
set_target_properties(addressbook PROPERTIES
|
||||
WIN32_EXECUTABLE TRUE
|
||||
MACOSX_BUNDLE TRUE
|
||||
)
|
||||
|
||||
target_link_libraries(addressbook PRIVATE
|
||||
Qt6::Core
|
||||
Qt6::Gui
|
||||
Qt6::Widgets
|
||||
)
|
||||
|
||||
install(TARGETS addressbook
|
||||
RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}"
|
||||
)
|
59
examples/widgets/itemviews/addressbook/adddialog.cpp
Normal file
59
examples/widgets/itemviews/addressbook/adddialog.cpp
Normal file
@ -0,0 +1,59 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "adddialog.h"
|
||||
|
||||
#include <QtWidgets>
|
||||
|
||||
//! [0]
|
||||
AddDialog::AddDialog(QWidget *parent)
|
||||
: QDialog(parent),
|
||||
nameText(new QLineEdit),
|
||||
addressText(new QTextEdit)
|
||||
{
|
||||
auto nameLabel = new QLabel(tr("Name"));
|
||||
auto addressLabel = new QLabel(tr("Address"));
|
||||
auto okButton = new QPushButton(tr("OK"));
|
||||
auto cancelButton = new QPushButton(tr("Cancel"));
|
||||
|
||||
auto gLayout = new QGridLayout;
|
||||
gLayout->setColumnStretch(1, 2);
|
||||
gLayout->addWidget(nameLabel, 0, 0);
|
||||
gLayout->addWidget(nameText, 0, 1);
|
||||
|
||||
gLayout->addWidget(addressLabel, 1, 0, Qt::AlignLeft|Qt::AlignTop);
|
||||
gLayout->addWidget(addressText, 1, 1, Qt::AlignLeft);
|
||||
|
||||
auto buttonLayout = new QHBoxLayout;
|
||||
buttonLayout->addWidget(okButton);
|
||||
buttonLayout->addWidget(cancelButton);
|
||||
|
||||
gLayout->addLayout(buttonLayout, 2, 1, Qt::AlignRight);
|
||||
|
||||
auto mainLayout = new QVBoxLayout;
|
||||
mainLayout->addLayout(gLayout);
|
||||
setLayout(mainLayout);
|
||||
|
||||
connect(okButton, &QAbstractButton::clicked, this, &QDialog::accept);
|
||||
connect(cancelButton, &QAbstractButton::clicked, this, &QDialog::reject);
|
||||
|
||||
setWindowTitle(tr("Add a Contact"));
|
||||
}
|
||||
|
||||
QString AddDialog::name() const
|
||||
{
|
||||
return nameText->text();
|
||||
}
|
||||
|
||||
QString AddDialog::address() const
|
||||
{
|
||||
return addressText->toPlainText();
|
||||
}
|
||||
|
||||
void AddDialog::editAddress(const QString &name, const QString &address)
|
||||
{
|
||||
nameText->setReadOnly(true);
|
||||
nameText->setText(name);
|
||||
addressText->setPlainText(address);
|
||||
}
|
||||
//! [0]
|
34
examples/widgets/itemviews/addressbook/adddialog.h
Normal file
34
examples/widgets/itemviews/addressbook/adddialog.h
Normal file
@ -0,0 +1,34 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef ADDDIALOG_H
|
||||
#define ADDDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QLabel;
|
||||
class QPushButton;
|
||||
class QTextEdit;
|
||||
class QLineEdit;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
//! [0]
|
||||
class AddDialog : public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AddDialog(QWidget *parent = nullptr);
|
||||
|
||||
QString name() const;
|
||||
QString address() const;
|
||||
void editAddress(const QString &name, const QString &address);
|
||||
|
||||
private:
|
||||
QLineEdit *nameText;
|
||||
QTextEdit *addressText;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif // ADDDIALOG_H
|
18
examples/widgets/itemviews/addressbook/addressbook.pro
Normal file
18
examples/widgets/itemviews/addressbook/addressbook.pro
Normal file
@ -0,0 +1,18 @@
|
||||
QT += widgets
|
||||
requires(qtConfig(listview))
|
||||
|
||||
SOURCES = adddialog.cpp \
|
||||
addresswidget.cpp \
|
||||
main.cpp \
|
||||
mainwindow.cpp \
|
||||
newaddresstab.cpp \
|
||||
tablemodel.cpp
|
||||
HEADERS = adddialog.h \
|
||||
addresswidget.h \
|
||||
mainwindow.h \
|
||||
newaddresstab.h \
|
||||
tablemodel.h
|
||||
|
||||
# install
|
||||
target.path = $$[QT_INSTALL_EXAMPLES]/widgets/itemviews/addressbook
|
||||
INSTALLS += target
|
186
examples/widgets/itemviews/addressbook/addresswidget.cpp
Normal file
186
examples/widgets/itemviews/addressbook/addresswidget.cpp
Normal file
@ -0,0 +1,186 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "addresswidget.h"
|
||||
#include "adddialog.h"
|
||||
|
||||
#include <QtWidgets>
|
||||
|
||||
//! [0]
|
||||
AddressWidget::AddressWidget(QWidget *parent)
|
||||
: QTabWidget(parent),
|
||||
table(new TableModel(this)),
|
||||
newAddressTab(new NewAddressTab(this))
|
||||
{
|
||||
connect(newAddressTab, &NewAddressTab::sendDetails,
|
||||
this, &AddressWidget::addEntry);
|
||||
|
||||
addTab(newAddressTab, tr("Address Book"));
|
||||
|
||||
setupTabs();
|
||||
}
|
||||
//! [0]
|
||||
|
||||
//! [2]
|
||||
void AddressWidget::showAddEntryDialog()
|
||||
{
|
||||
AddDialog aDialog;
|
||||
|
||||
if (aDialog.exec())
|
||||
addEntry(aDialog.name(), aDialog.address());
|
||||
}
|
||||
//! [2]
|
||||
|
||||
//! [3]
|
||||
void AddressWidget::addEntry(const QString &name, const QString &address)
|
||||
{
|
||||
if (!table->getContacts().contains({ name, address })) {
|
||||
table->insertRows(0, 1, QModelIndex());
|
||||
|
||||
QModelIndex index = table->index(0, 0, QModelIndex());
|
||||
table->setData(index, name, Qt::EditRole);
|
||||
index = table->index(0, 1, QModelIndex());
|
||||
table->setData(index, address, Qt::EditRole);
|
||||
removeTab(indexOf(newAddressTab));
|
||||
} else {
|
||||
QMessageBox::information(this, tr("Duplicate Name"),
|
||||
tr("The name \"%1\" already exists.").arg(name));
|
||||
}
|
||||
}
|
||||
//! [3]
|
||||
|
||||
//! [4a]
|
||||
void AddressWidget::editEntry()
|
||||
{
|
||||
QTableView *temp = static_cast<QTableView*>(currentWidget());
|
||||
QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(temp->model());
|
||||
QItemSelectionModel *selectionModel = temp->selectionModel();
|
||||
|
||||
const QModelIndexList indexes = selectionModel->selectedRows();
|
||||
QString name;
|
||||
QString address;
|
||||
int row = -1;
|
||||
|
||||
for (const QModelIndex &index : indexes) {
|
||||
row = proxy->mapToSource(index).row();
|
||||
QModelIndex nameIndex = table->index(row, 0, QModelIndex());
|
||||
QVariant varName = table->data(nameIndex, Qt::DisplayRole);
|
||||
name = varName.toString();
|
||||
|
||||
QModelIndex addressIndex = table->index(row, 1, QModelIndex());
|
||||
QVariant varAddr = table->data(addressIndex, Qt::DisplayRole);
|
||||
address = varAddr.toString();
|
||||
}
|
||||
//! [4a]
|
||||
|
||||
//! [4b]
|
||||
AddDialog aDialog;
|
||||
aDialog.setWindowTitle(tr("Edit a Contact"));
|
||||
aDialog.editAddress(name, address);
|
||||
|
||||
if (aDialog.exec()) {
|
||||
const QString newAddress = aDialog.address();
|
||||
if (newAddress != address) {
|
||||
const QModelIndex index = table->index(row, 1, QModelIndex());
|
||||
table->setData(index, newAddress, Qt::EditRole);
|
||||
}
|
||||
}
|
||||
}
|
||||
//! [4b]
|
||||
|
||||
//! [5]
|
||||
void AddressWidget::removeEntry()
|
||||
{
|
||||
QTableView *temp = static_cast<QTableView*>(currentWidget());
|
||||
QSortFilterProxyModel *proxy = static_cast<QSortFilterProxyModel*>(temp->model());
|
||||
QItemSelectionModel *selectionModel = temp->selectionModel();
|
||||
|
||||
const QModelIndexList indexes = selectionModel->selectedRows();
|
||||
|
||||
for (QModelIndex index : indexes) {
|
||||
int row = proxy->mapToSource(index).row();
|
||||
table->removeRows(row, 1, QModelIndex());
|
||||
}
|
||||
|
||||
if (table->rowCount(QModelIndex()) == 0)
|
||||
insertTab(0, newAddressTab, tr("Address Book"));
|
||||
}
|
||||
//! [5]
|
||||
|
||||
//! [1]
|
||||
void AddressWidget::setupTabs()
|
||||
{
|
||||
using namespace Qt::StringLiterals;
|
||||
const auto groups = { "ABC"_L1, "DEF"_L1, "GHI"_L1, "JKL"_L1, "MNO"_L1, "PQR"_L1,
|
||||
"STU"_L1, "VW"_L1, "XYZ"_L1 };
|
||||
|
||||
for (QLatin1StringView str : groups) {
|
||||
const auto regExp = QRegularExpression(QLatin1StringView("^[%1].*").arg(str),
|
||||
QRegularExpression::CaseInsensitiveOption);
|
||||
|
||||
auto proxyModel = new QSortFilterProxyModel(this);
|
||||
proxyModel->setSourceModel(table);
|
||||
proxyModel->setFilterRegularExpression(regExp);
|
||||
proxyModel->setFilterKeyColumn(0);
|
||||
|
||||
QTableView *tableView = new QTableView;
|
||||
tableView->setModel(proxyModel);
|
||||
tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
|
||||
tableView->horizontalHeader()->setStretchLastSection(true);
|
||||
tableView->verticalHeader()->hide();
|
||||
tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
tableView->setSelectionMode(QAbstractItemView::SingleSelection);
|
||||
tableView->setSortingEnabled(true);
|
||||
|
||||
connect(tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
|
||||
this, &AddressWidget::selectionChanged);
|
||||
|
||||
connect(this, &QTabWidget::currentChanged, this, [this, tableView](int tabIndex) {
|
||||
if (widget(tabIndex) == tableView)
|
||||
emit selectionChanged(tableView->selectionModel()->selection());
|
||||
});
|
||||
|
||||
addTab(tableView, str);
|
||||
}
|
||||
}
|
||||
//! [1]
|
||||
|
||||
//! [7]
|
||||
void AddressWidget::readFromFile()
|
||||
{
|
||||
QFile file(fileName);
|
||||
|
||||
if (!file.open(QIODevice::ReadOnly)) {
|
||||
QMessageBox::information(this, tr("Unable to open file"),
|
||||
file.errorString());
|
||||
return;
|
||||
}
|
||||
|
||||
QList<Contact> contacts;
|
||||
QDataStream in(&file);
|
||||
in >> contacts;
|
||||
|
||||
if (contacts.isEmpty()) {
|
||||
QMessageBox::information(this, tr("No contacts in file"),
|
||||
tr("The file you are attempting to open contains no contacts."));
|
||||
} else {
|
||||
for (const auto &contact: std::as_const(contacts))
|
||||
addEntry(contact.name, contact.address);
|
||||
}
|
||||
}
|
||||
//! [7]
|
||||
|
||||
//! [6]
|
||||
void AddressWidget::writeToFile()
|
||||
{
|
||||
QFile file(fileName);
|
||||
|
||||
if (!file.open(QIODevice::WriteOnly)) {
|
||||
QMessageBox::information(this, tr("Unable to open file"), file.errorString());
|
||||
return;
|
||||
}
|
||||
|
||||
QDataStream out(&file);
|
||||
out << table->getContacts();
|
||||
}
|
||||
//! [6]
|
49
examples/widgets/itemviews/addressbook/addresswidget.h
Normal file
49
examples/widgets/itemviews/addressbook/addresswidget.h
Normal file
@ -0,0 +1,49 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef ADDRESSWIDGET_H
|
||||
#define ADDRESSWIDGET_H
|
||||
|
||||
#include "newaddresstab.h"
|
||||
#include "tablemodel.h"
|
||||
|
||||
#include <QItemSelection>
|
||||
#include <QTabWidget>
|
||||
#include <QStandardPaths>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QSortFilterProxyModel;
|
||||
class QItemSelectionModel;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
//! [0]
|
||||
class AddressWidget : public QTabWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
AddressWidget(QWidget *parent = nullptr);
|
||||
void readFromFile();
|
||||
void writeToFile();
|
||||
|
||||
public slots:
|
||||
void showAddEntryDialog();
|
||||
void addEntry(const QString &name, const QString &address);
|
||||
void editEntry();
|
||||
void removeEntry();
|
||||
|
||||
signals:
|
||||
void selectionChanged (const QItemSelection &selected);
|
||||
|
||||
private:
|
||||
void setupTabs();
|
||||
|
||||
inline static QString fileName =
|
||||
QStandardPaths::standardLocations(QStandardPaths::TempLocation).value(0)
|
||||
+ QStringLiteral("/addressbook.dat");
|
||||
TableModel *table;
|
||||
NewAddressTab *newAddressTab;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif // ADDRESSWIDGET_H
|
16
examples/widgets/itemviews/addressbook/main.cpp
Normal file
16
examples/widgets/itemviews/addressbook/main.cpp
Normal file
@ -0,0 +1,16 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
//! [0]
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
QApplication app(argc, argv);
|
||||
MainWindow mw;
|
||||
mw.show();
|
||||
return app.exec();
|
||||
}
|
||||
//! [0]
|
93
examples/widgets/itemviews/addressbook/mainwindow.cpp
Normal file
93
examples/widgets/itemviews/addressbook/mainwindow.cpp
Normal file
@ -0,0 +1,93 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "mainwindow.h"
|
||||
|
||||
#include <QAction>
|
||||
#include <QFileDialog>
|
||||
#include <QMenuBar>
|
||||
|
||||
//! [0]
|
||||
MainWindow::MainWindow()
|
||||
: QMainWindow(),
|
||||
addressWidget(new AddressWidget)
|
||||
{
|
||||
setCentralWidget(addressWidget);
|
||||
createMenus();
|
||||
setWindowTitle(tr("Address Book"));
|
||||
}
|
||||
//! [0]
|
||||
|
||||
//! [1a]
|
||||
void MainWindow::createMenus()
|
||||
{
|
||||
QMenu *fileMenu = menuBar()->addMenu(tr("&File"));
|
||||
|
||||
QAction *openAct = new QAction(tr("&Open..."), this);
|
||||
fileMenu->addAction(openAct);
|
||||
connect(openAct, &QAction::triggered, this, &MainWindow::openFile);
|
||||
//! [1a]
|
||||
|
||||
QAction *saveAct = new QAction(tr("&Save"), this);
|
||||
fileMenu->addAction(saveAct);
|
||||
connect(saveAct, &QAction::triggered, this, &MainWindow::saveFile);
|
||||
|
||||
fileMenu->addSeparator();
|
||||
|
||||
QAction *exitAct = new QAction(tr("E&xit"), this);
|
||||
fileMenu->addAction(exitAct);
|
||||
connect(exitAct, &QAction::triggered, this, &QWidget::close);
|
||||
|
||||
QMenu *toolMenu = menuBar()->addMenu(tr("&Tools"));
|
||||
|
||||
QAction *addAct = new QAction(tr("&Add Entry..."), this);
|
||||
toolMenu->addAction(addAct);
|
||||
connect(addAct, &QAction::triggered,
|
||||
addressWidget, &AddressWidget::showAddEntryDialog);
|
||||
|
||||
//! [1b]
|
||||
editAct = new QAction(tr("&Edit Entry..."), this);
|
||||
editAct->setEnabled(false);
|
||||
toolMenu->addAction(editAct);
|
||||
connect(editAct, &QAction::triggered, addressWidget, &AddressWidget::editEntry);
|
||||
|
||||
toolMenu->addSeparator();
|
||||
|
||||
removeAct = new QAction(tr("&Remove Entry"), this);
|
||||
removeAct->setEnabled(false);
|
||||
toolMenu->addAction(removeAct);
|
||||
connect(removeAct, &QAction::triggered, addressWidget, &AddressWidget::removeEntry);
|
||||
|
||||
connect(addressWidget, &AddressWidget::selectionChanged,
|
||||
this, &MainWindow::updateActions);
|
||||
}
|
||||
//! [1b]
|
||||
|
||||
//! [2]
|
||||
void MainWindow::openFile()
|
||||
{
|
||||
addressWidget->readFromFile();
|
||||
}
|
||||
//! [2]
|
||||
|
||||
//! [3]
|
||||
void MainWindow::saveFile()
|
||||
{
|
||||
addressWidget->writeToFile();
|
||||
}
|
||||
//! [3]
|
||||
|
||||
//! [4]
|
||||
void MainWindow::updateActions(const QItemSelection &selection)
|
||||
{
|
||||
QModelIndexList indexes = selection.indexes();
|
||||
|
||||
if (!indexes.isEmpty()) {
|
||||
removeAct->setEnabled(true);
|
||||
editAct->setEnabled(true);
|
||||
} else {
|
||||
removeAct->setEnabled(false);
|
||||
editAct->setEnabled(false);
|
||||
}
|
||||
}
|
||||
//! [4]
|
33
examples/widgets/itemviews/addressbook/mainwindow.h
Normal file
33
examples/widgets/itemviews/addressbook/mainwindow.h
Normal file
@ -0,0 +1,33 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef MAINWINDOW_H
|
||||
#define MAINWINDOW_H
|
||||
|
||||
#include "addresswidget.h"
|
||||
|
||||
#include <QMainWindow>
|
||||
|
||||
//! [0]
|
||||
class MainWindow : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWindow();
|
||||
|
||||
private slots:
|
||||
void updateActions(const QItemSelection &selection);
|
||||
void openFile();
|
||||
void saveFile();
|
||||
|
||||
private:
|
||||
void createMenus();
|
||||
|
||||
AddressWidget *addressWidget;
|
||||
QAction *editAct;
|
||||
QAction *removeAct;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif // MAINWINDOW_H
|
36
examples/widgets/itemviews/addressbook/newaddresstab.cpp
Normal file
36
examples/widgets/itemviews/addressbook/newaddresstab.cpp
Normal file
@ -0,0 +1,36 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "newaddresstab.h"
|
||||
#include "adddialog.h"
|
||||
|
||||
#include <QtWidgets>
|
||||
|
||||
//! [0]
|
||||
NewAddressTab::NewAddressTab(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
{
|
||||
auto descriptionLabel = new QLabel(tr("There are currently no contacts in your address book. "
|
||||
"\nClick Add to add new contacts."));
|
||||
|
||||
auto addButton = new QPushButton(tr("Add"));
|
||||
|
||||
connect(addButton, &QAbstractButton::clicked, this, &NewAddressTab::addEntry);
|
||||
|
||||
auto mainLayout = new QVBoxLayout;
|
||||
mainLayout->addWidget(descriptionLabel);
|
||||
mainLayout->addWidget(addButton, 0, Qt::AlignCenter);
|
||||
|
||||
setLayout(mainLayout);
|
||||
}
|
||||
//! [0]
|
||||
|
||||
//! [1]
|
||||
void NewAddressTab::addEntry()
|
||||
{
|
||||
AddDialog aDialog;
|
||||
|
||||
if (aDialog.exec())
|
||||
emit sendDetails(aDialog.name(), aDialog.address());
|
||||
}
|
||||
//! [1]
|
31
examples/widgets/itemviews/addressbook/newaddresstab.h
Normal file
31
examples/widgets/itemviews/addressbook/newaddresstab.h
Normal file
@ -0,0 +1,31 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef NEWADDRESSTAB_H
|
||||
#define NEWADDRESSTAB_H
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
QT_BEGIN_NAMESPACE
|
||||
class QLabel;
|
||||
class QPushButton;
|
||||
class QVBoxLayout;
|
||||
QT_END_NAMESPACE
|
||||
|
||||
//! [0]
|
||||
class NewAddressTab : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
NewAddressTab(QWidget *parent = nullptr);
|
||||
|
||||
public slots:
|
||||
void addEntry();
|
||||
|
||||
signals:
|
||||
void sendDetails(const QString &name, const QString &address);
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif
|
145
examples/widgets/itemviews/addressbook/tablemodel.cpp
Normal file
145
examples/widgets/itemviews/addressbook/tablemodel.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#include "tablemodel.h"
|
||||
|
||||
//! [0]
|
||||
TableModel::TableModel(QObject *parent)
|
||||
: QAbstractTableModel(parent)
|
||||
{
|
||||
}
|
||||
|
||||
TableModel::TableModel(const QList<Contact> &contacts, QObject *parent)
|
||||
: QAbstractTableModel(parent), contacts(contacts)
|
||||
{
|
||||
}
|
||||
//! [0]
|
||||
|
||||
//! [1]
|
||||
int TableModel::rowCount(const QModelIndex &parent) const
|
||||
{
|
||||
return parent.isValid() ? 0 : contacts.size();
|
||||
}
|
||||
|
||||
int TableModel::columnCount(const QModelIndex &parent) const
|
||||
{
|
||||
return parent.isValid() ? 0 : 2;
|
||||
}
|
||||
//! [1]
|
||||
|
||||
//! [2]
|
||||
QVariant TableModel::data(const QModelIndex &index, int role) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return QVariant();
|
||||
|
||||
if (index.row() >= contacts.size() || index.row() < 0)
|
||||
return QVariant();
|
||||
|
||||
if (role == Qt::DisplayRole) {
|
||||
const auto &contact = contacts.at(index.row());
|
||||
|
||||
switch (index.column()) {
|
||||
case 0:
|
||||
return contact.name;
|
||||
case 1:
|
||||
return contact.address;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
//! [2]
|
||||
|
||||
//! [3]
|
||||
QVariant TableModel::headerData(int section, Qt::Orientation orientation, int role) const
|
||||
{
|
||||
if (role != Qt::DisplayRole)
|
||||
return QVariant();
|
||||
|
||||
if (orientation == Qt::Horizontal) {
|
||||
switch (section) {
|
||||
case 0:
|
||||
return tr("Name");
|
||||
case 1:
|
||||
return tr("Address");
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
//! [3]
|
||||
|
||||
//! [4]
|
||||
bool TableModel::insertRows(int position, int rows, const QModelIndex &index)
|
||||
{
|
||||
Q_UNUSED(index);
|
||||
beginInsertRows(QModelIndex(), position, position + rows - 1);
|
||||
|
||||
for (int row = 0; row < rows; ++row)
|
||||
contacts.insert(position, { QString(), QString() });
|
||||
|
||||
endInsertRows();
|
||||
return true;
|
||||
}
|
||||
//! [4]
|
||||
|
||||
//! [5]
|
||||
bool TableModel::removeRows(int position, int rows, const QModelIndex &index)
|
||||
{
|
||||
Q_UNUSED(index);
|
||||
beginRemoveRows(QModelIndex(), position, position + rows - 1);
|
||||
|
||||
for (int row = 0; row < rows; ++row)
|
||||
contacts.removeAt(position);
|
||||
|
||||
endRemoveRows();
|
||||
return true;
|
||||
}
|
||||
//! [5]
|
||||
|
||||
//! [6]
|
||||
bool TableModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||
{
|
||||
if (index.isValid() && role == Qt::EditRole) {
|
||||
const int row = index.row();
|
||||
auto contact = contacts.value(row);
|
||||
|
||||
switch (index.column()) {
|
||||
case 0:
|
||||
contact.name = value.toString();
|
||||
break;
|
||||
case 1:
|
||||
contact.address = value.toString();
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
contacts.replace(row, contact);
|
||||
emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
//! [6]
|
||||
|
||||
//! [7]
|
||||
Qt::ItemFlags TableModel::flags(const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return Qt::ItemIsEnabled;
|
||||
|
||||
return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
|
||||
}
|
||||
//! [7]
|
||||
|
||||
//! [8]
|
||||
const QList<Contact> &TableModel::getContacts() const
|
||||
{
|
||||
return contacts;
|
||||
}
|
||||
//! [8]
|
56
examples/widgets/itemviews/addressbook/tablemodel.h
Normal file
56
examples/widgets/itemviews/addressbook/tablemodel.h
Normal file
@ -0,0 +1,56 @@
|
||||
// Copyright (C) 2016 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
|
||||
|
||||
#ifndef TABLEMODEL_H
|
||||
#define TABLEMODEL_H
|
||||
|
||||
#include <QAbstractTableModel>
|
||||
#include <QList>
|
||||
|
||||
//! [0]
|
||||
|
||||
struct Contact
|
||||
{
|
||||
QString name;
|
||||
QString address;
|
||||
|
||||
bool operator==(const Contact &other) const
|
||||
{
|
||||
return name == other.name && address == other.address;
|
||||
}
|
||||
};
|
||||
|
||||
inline QDataStream &operator<<(QDataStream &stream, const Contact &contact)
|
||||
{
|
||||
return stream << contact.name << contact.address;
|
||||
}
|
||||
|
||||
inline QDataStream &operator>>(QDataStream &stream, Contact &contact)
|
||||
{
|
||||
return stream >> contact.name >> contact.address;
|
||||
}
|
||||
|
||||
class TableModel : public QAbstractTableModel
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TableModel(QObject *parent = nullptr);
|
||||
TableModel(const QList<Contact> &contacts, QObject *parent = nullptr);
|
||||
|
||||
int rowCount(const QModelIndex &parent) const override;
|
||||
int columnCount(const QModelIndex &parent) const override;
|
||||
QVariant data(const QModelIndex &index, int role) const override;
|
||||
QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
|
||||
Qt::ItemFlags flags(const QModelIndex &index) const override;
|
||||
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
|
||||
bool insertRows(int position, int rows, const QModelIndex &index = QModelIndex()) override;
|
||||
bool removeRows(int position, int rows, const QModelIndex &index = QModelIndex()) override;
|
||||
const QList<Contact> &getContacts() const;
|
||||
|
||||
private:
|
||||
QList<Contact> contacts;
|
||||
};
|
||||
//! [0]
|
||||
|
||||
#endif // TABLEMODEL_H
|
Reference in New Issue
Block a user