您的位置:首页 > 编程语言 > Qt开发

qt数据显示在不同视图

2015-05-23 09:25 176 查看

1.需求:

根据用户选择,将数据库中查询到的产品信息显示在三个视图中,第一个视图显示基本信息商品名称,品牌等,第二个视图显示相应商品的颜色,第三个视图显示相应商品颜色下的尺码,库存等信息

2.解决:

打算使用内存数据库+数据库查询model+tableview实现这个

3.代码:

数据库文件

//connection.h
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
** Contact: http://www.qt-project.org/legal **
** This file is part of the examples of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:BSD$
** You may use this file under the terms of the BSD license as follows:
**
** "Redistribution and use in source and binary forms, with or without
** modification, are permitted provided that the following conditions are
** met:
**   * Redistributions of source code must retain the above copyright
**     notice, this list of conditions and the following disclaimer.
**   * Redistributions in binary form must reproduce the above copyright
**     notice, this list of conditions and the following disclaimer in
**     the documentation and/or other materials provided with the
**     distribution.
**   * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names
**     of its contributors may be used to endorse or promote products derived
**     from this software without specific prior written permission.
**
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef CONNECTION_H
#define CONNECTION_H

#include <QMessageBox>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QtGlobal>
/*
This file defines a helper function to open a connection to an
in-memory SQLITE database and to create a test table.

If you want to use another database, simply modify the code
below. All the examples in this directory use this function to
connect to a database.
*/
//! [0]
static bool createConnection()
{
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
QMessageBox::critical(0, qApp->tr("Cannot open database"),
qApp->tr("Unable to establish a database connection.\n"
"This example needs SQLite support. Please read "
"the Qt SQL driver documentation for information how "
"to build it.\n\n"
"Click Cancel to exit."), QMessageBox::Cancel);
return false;
}

QTextCodec *gbk = QTextCodec::codecForName("GB18030");
if (gbk)
{
QSqlQuery query;
query.exec("create table goods (id varchar(33) primary key, "
"name varchar(200), color varchar(20), "
"size varchar(20), retail varchar(20), "
"storage int, productid varchar(33), "
"unitname varchar(20), no varchar(200))");

std::string strgb18030("insert into goods values('7A7BA4B902C147E6A37BAF325DB14D50', '七匹狼', '红色', 'L', '100.50', 100, '7A7BA4B902C147E6A37BAF325DB14D50', '件', '20151020')");
QString strUnicode = gbk->toUnicode(strgb18030.c_str());
Q_ASSERT(query.exec(strUnicode));

strgb18030 = "insert into goods values('7A7BA4B902C147E6A37BAF325DB14D51', '七匹狼', '红色', 'S', '100.50', 100, '7A7BA4B902C147E6A37BAF325DB14D50', '件', '20151021')";
strUnicode = gbk->toUnicode(strgb18030.c_str());
query.exec(strUnicode);

strgb18030 = "insert into goods values('7A7BA4B902C147E6A37BAF325DB14D52', '八匹马', '绿色', 'L', '100.50', 100, '7A7BA4B902C147E6A37BAF325DB14D50', '件', '20151022')";
strUnicode = gbk->toUnicode(strgb18030.c_str());
query.exec(strUnicode);

strgb18030 = "insert into goods values('7A7BA4B902C147E6A37BAF325DB14D53', '八匹马', '绿色', , 'S', '100.50', 100, '7A7BA4B902C147E6A37BAF325DB14D50', '件', '20151023')";
strUnicode = gbk->toUnicode(strgb18030.c_str());
query.exec(strUnicode);

strgb18030 = "insert into goods values('7A7BA4B902C147E6A37BAF325DB14D54', '七匹狼', '蓝色', 'XL', '100.50', 100, '7A7BA4B902C147E6A37BAF325DB14D50', '件', '20151024')";
strUnicode = gbk->toUnicode(strgb18030.c_str());
query.exec(strUnicode);
}
return true;
}
//! [0]

#endif


声明文件

//mysel.h
#ifndef MYSQL_H
#define MYSQL_H

#include <QtWidgets/QMainWindow>
#include "ui_mysql.h"
#include <QtSql>

class mysql : public QMainWindow
{
Q_OBJECT

public:
mysql(QWidget *parent = 0);
~mysql();

private slots:
void goodSelect(QModelIndex current);
void colorSelect(QModelIndex current);
void leftview();
void rightview();

private:
void initializeModel();
void changeview(bool bleft);

private:
Ui::mysqlClass ui;
QSqlQueryModel goodmodel;
QSqlQueryModel colormodel;
QSqlQueryModel sizemodel;
};

#endif // MYSQL_H


实现文件

//mysel.cpp
#include "mysql.h"
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QtGui/QKeySequence>
#include <QtWidgets/QShortcut>
#include <QMessageBox>

mysql::mysql(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
initializeModel();
ui.goodView->setModel(&goodmodel);
ui.colorView->setModel(&colormodel);
ui.sizeView->setModel(&sizemodel);

ui.goodView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui.goodView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui.goodView->setEditTriggers(QAbstractItemView::NoEditTriggers);

ui.colorView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui.colorView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui.colorView->setEditTriggers(QAbstractItemView::NoEditTriggers);

ui.sizeView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
ui.sizeView->setSelectionBehavior(QAbstractItemView::SelectRows);
ui.sizeView->setEditTriggers(QAbstractItemView::NoEditTriggers);

//当model的选中状态改变时需要搞定的东西
connect(ui.goodView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
this, SLOT(goodSelect(QModelIndex)));
connect(ui.colorView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
this, SLOT(colorSelect(QModelIndex)));

ui.goodView->installEventFilter(this);
ui.colorView->installEventFilter(this);
ui.sizeView->installEventFilter(this);
QShortcut *pshort = new QShortcut(Qt::Key_Left, this);
connect(pshort, SIGNAL(activated()), this, SLOT(leftview()));
pshort = new QShortcut(Qt::Key_Right, this);
connect(pshort, SIGNAL(activated()), this, SLOT(rightview()));

//默认选中第一条
QModelIndex index = goodmodel.index(0, 0);
if (index.isValid())
ui.goodView->setCurrentIndex(index);
}

mysql::~mysql()
{

}

void mysql::initializeModel()
{
goodmodel.setQuery("select distinct name, no from goods group by name");
goodmodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("品牌"));
goodmodel.setHeaderData(1, Qt::Horizontal, QStringLiteral("编号"));

colormodel.setQuery("select distinct color from goods group by color");
colormodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("颜色"));

sizemodel.setQuery("select distinct size, storage from goods group by size");
sizemodel.setHeaderData(0, Qt::Horizontal, QStringLiteral("尺码"));
sizemodel.setHeaderData(1, Qt::Horizontal, QStringLiteral("库存"));
}

void mysql::goodSelect(QModelIndex current)
{
//这里要更新下颜色和尺码部分
//首先得到名称和编号
QString strName(""), strColor("");
QModelIndex nameindex = goodmodel.index(current.row(), 0);
if (nameindex.isValid())
strName = goodmodel.data(nameindex, Qt::DisplayRole).toString();

if (!strName.isEmpty())
{
//这里实现拼字符串
QString strSel("");
strSel = QString("select distinct color from goods where name = '%1' group by color").arg(strName);
colormodel.setQuery(strSel);

QModelIndex colorindex;
colorindex = colormodel.index(0, 0);
if (colorindex.isValid())
{
ui.colorView->setCurrentIndex(colorindex);

strColor = colormodel.data(colorindex, Qt::DisplayRole).toString();

QString strSel("");
strSel = QString("select distinct size, storage from goods where name = '%1' and color = '%2' group by size").arg(strName).arg(strColor);
sizemodel.setQuery(strSel);

QModelIndex index;
index = sizemodel.index(0, 0);
if (index.isValid())
ui.sizeView->setCurrentIndex(index);
}
}
}

void mysql::colorSelect(QModelIndex current)
{
//这个要修改尺寸部分
QString strName(""), strColor("");
QModelIndex goodindex = ui.goodView->currentIndex();
if (goodindex.isValid())
{
QModelIndex nameindex = goodmodel.index(goodindex.row(), 0);
if (nameindex.isValid())
strName = goodmodel.data(nameindex, Qt::DisplayRole).toString();
}

if (current.isValid())
{
QModelIndex colorindex = colormodel.index(current.row(), 0);
if (colorindex.isValid())
strColor = colormodel.data(colorindex, Qt::DisplayRole).toString();
}

if (!strName.isEmpty() && !strColor.isEmpty())
{
//这里实现拼字符串
QString strSel("");
strSel = QString("select distinct size, storage from goods where name = '%1' and color = '%2' group by size").arg(strName).arg(strColor);
sizemodel.setQuery(strSel);

QModelIndex index;
index = sizemodel.index(0, 0);
if (index.isValid())
ui.sizeView->setCurrentIndex(index);
}
}

//改变view显示
void mysql::changeview(bool bleft)
{
QWidget *allview[3] = {ui.goodView, ui.colorView, ui.sizeView};
QWidget *pfocus = focusWidget();
int ncurrent = 0;
for (ncurrent = 0; ncurrent < 3; ++ncurrent)
{
if (pfocus == allview[ncurrent])
break;
}

if (ncurrent >= 0 && ncurrent < 3)
{
if (bleft)
ncurrent -= 1;
else
ncurrent += 1;

if (ncurrent < 0)
allview[2]->setFocus();
else if (ncurrent >= 3)
allview[0]->setFocus();
else
allview[ncurrent]->setFocus();
}
}

void mysql::leftview()
{
changeview(true);
}

void mysql::rightview()
{
changeview(false);
}


主文件

//main.cpp
#include "mysql.h"
#include <QtWidgets/QApplication>
#include "connection.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
if (!createConnection())
return 0;

mysql w;
w.show();
return a.exec();
}


备注:vs2010 + qt5.40 +win7上编译通过

3.参考

qt自带例子数据库部分的querymodel程序

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息