有一段qt代码没看不懂

q672856032 2011-01-27 09:11:30
#include <QtCore>

#include "currencymodel.h"

CurrencyModel::CurrencyModel(QObject *parent)
: QAbstractTableModel(parent)
{
}

void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
{
currencyMap = map;
reset();
}

int CurrencyModel::rowCount(const QModelIndex & /* parent */) const
{
return currencyMap.count();
}

int CurrencyModel::columnCount(const QModelIndex & /* parent */) const
{
return currencyMap.count();
}

QVariant CurrencyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();

if (role == Qt::TextAlignmentRole) {
return int(Qt::AlignRight | Qt::AlignVCenter);
} else if (role == Qt::DisplayRole) {
QString rowCurrency = currencyAt(index.row());
QString columnCurrency = currencyAt(index.column());

if (currencyMap.value(rowCurrency) == 0.0)
return "####";

double amount = currencyMap.value(columnCurrency)
/ currencyMap.value(rowCurrency);

return QString("%1").arg(amount, 0, 'f', 4);
}
return QVariant();
}

//重点在这里这个函数是什么意思?? return QVariant();怎么能够这么返回的? QVariant(); 不是对象吗?返回的是什么?
QVariant CurrencyModel::headerData(int section,
Qt::Orientation /* orientation */,
int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
return currencyAt(section);
}

QString CurrencyModel::currencyAt(int offset) const
{
return (currencyMap.begin() + offset).key();
}


主程序代码

#include "currencymodel.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QMap<QString, double> currencyMap;
currencyMap.insert("AUD", 1.3259);
currencyMap.insert("CHF", 1.2970);
currencyMap.insert("CZK", 24.510);
currencyMap.insert("DKK", 6.2168);
currencyMap.insert("EUR", 0.8333);
currencyMap.insert("GBP", 0.5661);
currencyMap.insert("HKD", 7.7562);
currencyMap.insert("JPY", 112.92);
currencyMap.insert("NOK", 6.5200);
currencyMap.insert("NZD", 1.4697);
currencyMap.insert("SEK", 7.8180);
currencyMap.insert("SGD", 1.6901);
currencyMap.insert("USD", 1.0000);

CurrencyModel currencyModel;
currencyModel.setCurrencyMap(currencyMap);

QTableView tableView;
tableView.setModel(¤cyModel);
tableView.setAlternatingRowColors(true);

tableView.setWindowTitle(QObject::tr("Currencies"));
tableView.show();

return app.exec();
}
...全文
253 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
abnerle 2011-02-15
  • 打赏
  • 举报
回复
好高深啊
zoumingmozhe 2011-02-06
  • 打赏
  • 举报
回复
其实这个有点像MFC里面的类之间的关联。
在Qt里面,有个Model/view机制,当你使用的时候,一般会继承这些类。
tableView.setModel(¤cyModel);这句代码,把Model和View关联起来了。
当TableView进行渲染的时候,它会去通过Modele实现的方法取数据,不同的数据的数据来源不同,Qt提供的基类提供了一些默认的实现。其中headerData()这个函数也有默认的实现,这个函数应该是个虚函数,所以,当你要实现自己的表头时,你重新实现了这个函数。

以上是个人的一些学习理解,至于具体的调用细节以及Delegate等,楼主可以去看相关的API文档。
wangxuefan1220 2011-01-28
  • 打赏
  • 举报
回复
QVariant可以转变为任意类型
巴依老爷 2011-01-27
  • 打赏
  • 举报
回复
QVariant()返回一个不合法的 variant,可通过isValid ()检查
q672856032 2011-01-27
  • 打赏
  • 举报
回复
说错了是data里面的return QVariant()注释掉
程序里网格的前面就会有一个小方块
q672856032 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jlzcg 的回复:]
1、先是生成临时对象 => QVariant()构造函数生成的
2、函数原型声明返回QVariant类型值
3、将返回值赋值给对应对象(是值拷贝)
[/Quote]

这些道理我都懂!!我想知道他这么做的意义。
QVariant里面没有值啊???这么做具体的价值是什么??

比如我把
CurrencyModel::headerData
里面的return QVariant()注释掉,程序里网格的前面就会有一个小方块是怎么回事???
jlzcg 2011-01-27
  • 打赏
  • 举报
回复
1、先是生成临时对象 => QVariant()构造函数生成的
2、函数原型声明返回QVariant类型值
3、将返回值赋值给对应对象(是值拷贝)
q672856032 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 q672856032 的回复:]
C/C++ code
#include <QtCore>

#include "currencymodel.h"

CurrencyModel::CurrencyModel(QObject *parent)
: QAbstractTableModel(parent)
{
}

void CurrencyModel::setCurrencyMap(const QMap<Q……
[/Quote]

我的意思是说headerData和data方法里面都有返回QVariant();这到底返回的是什么?
q672856032 2011-01-27
  • 打赏
  • 举报
回复
有人理解吗?
q672856032 2011-01-27
  • 打赏
  • 举报
回复
我还是不理解这个函数的意思。CurrencyModel::headerData是谁调用的?
dbzhang800 2011-01-27
  • 打赏
  • 举报
回复
建议你先找本 C++ 的书好好看看。

QVariant v = QVariant();
(或其等价的 QVariant v;)

然后

return v;


都是基本用法吧?
阿迷创客 2011-01-27
  • 打赏
  • 举报
回复
//重点在这里这个函数是什么意思?? return QVariant();怎么能够这么返回的? QVariant(); 不是对象吗?返回的是什么?
QVariant CurrencyModel::headerData(int section,
Qt::Orientation /* orientation */,
int role) const
{
//如果不是显示的角色,则返回“无用”的值,否则,返回那个表的那列的字段名,这个字段名在使用的时候要经过强制类型转换,这个字段名,也许是图片、文字或别的东西(是你自己定义的或默认)
if (role != Qt::DisplayRole)
return QVariant();
return currencyAt(section);
}

阿迷创客 2011-01-27
  • 打赏
  • 举报
回复
CurrencyModel::headerData
代表的是表格的表头数据,例如有一列数据为人民币兑换各个币种的比价,而调用headerData得到的就是这列数据的字段名,如“比价”,这个字段名默认可以是你数据库里面这列数据的字段名,也可以自己定义

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧