C++ Gui Programming with Qt4 第十章的一个例子

十秒耿直拆包选手 2014-06-02 08:57:00
CoordinateSetter是第十章关于QTableWidget和QTableWidgetItem的一个例子,
在此例中作者在每个项中创建QTableWidgetItem实例,并将坐标值写到其中。我想像第四章中SpreadSheet例子那样,通过调用QTableWidget::setItemPrototype(),在需要时由QTableWidget实例自动生成项。但是改写后发现不能自动生成项,麻烦看谁能够给找出问题,谢谢。
头文件
#ifndef TESTTABLEWIDGET_H
#define TESTTABLEWIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
class QTableWidget;
QT_END_NAMESPACE

class TestTableWidget : public QWidget
{
Q_OBJECT
public:
explicit TestTableWidget(const QList<QPointF>* coord, QWidget *parent = 0);

private:
void addRow();

private:
QTableWidget* pTableWidget;
const QList<QPointF>* pCoordinates;
};

#endif // TESTTABLEWIDGET_H


实现文件
#include "testtablewidget.h"

#include <QTableWidget>
#include <QStringList>
#include <QTableWidgetItem>
#include <QVBoxLayout>

TestTableWidget::TestTableWidget(const QList<QPointF>* coord,
QWidget *parent) :
QWidget(parent),
pTableWidget(new QTableWidget(10, 2, this))
{
pCoordinates = coord;
QStringList strList;
strList.append(tr("X"));
strList.append(tr("Y"));

pTableWidget->setHorizontalHeaderLabels(strList);
pTableWidget->setItemPrototype(new QTableWidgetItem());
//set pTableWidget to be disabled for changing item.
//pTableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

for (int row(0); row != pCoordinates->count(); ++row) {
QPointF point = pCoordinates->at(row);
//addRow();
pTableWidget->item(row, 0)->setText(QString::number(point.x()));
pTableWidget->item(row, 1)->setText(QString::number(point.y()));
}

QVBoxLayout* vBoxLayout(new QVBoxLayout(this));
vBoxLayout->addWidget(pTableWidget);
setLayout(vBoxLayout);
}

void TestTableWidget::addRow()
{
int row(pTableWidget->rowCount());
pTableWidget->insertRow(row);
/*
QTableWidgetItem* item0(new QTableWidgetItem());
item0->setTextAlignment(Qt::AlignVCenter | Qt::AlignLeft);
pTableWidget->setItem(row, 0, item0);

QTableWidgetItem* item1(new QTableWidgetItem());
item1->setTextAlignment(Qt::AlignBaseline | Qt::AlignRight);
pTableWidget->setItem(row, 1, item1);

pTableWidget->setCurrentCell(row, 0);
*/
}


main函数
#include <QtWidgets>

#include "coordinatesetter.h"
#include "testtablewidget.h"

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

QList<QPointF> coordinates;
coordinates << QPointF(0.0, 0.9)
<< QPointF(0.2, 11.0)
<< QPointF(0.4, 15.4)
<< QPointF(0.6, 12.9)
<< QPointF(0.8, 8.5)
<< QPointF(1.0, 7.1)
<< QPointF(1.2, 4.0)
<< QPointF(1.4, 13.6)
<< QPointF(1.6, 22.2)
<< QPointF(1.8, 22.2);
//CoordinateSetter coordinateSetter(&coordinates);
//coordinateSetter.show();
TestTableWidget coordinateSetter(&coordinates);
coordinateSetter.show();

return app.exec();
}


在运行到pTableWidget->item(row, 0)->setText(QString::number(point.x()));这里报错。
...全文
174 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdu_hanson 2014-06-04
  • 打赏
  • 举报
回复
引用 4 楼 sdu_hanson 的回复:
可以通过model写 QModelIndex idx = pTableWidget->model()->index(1,1); pTableWidget->model()->setData(idx,"sdfdsfds");//设置内容
引用 7 楼 weiweiqiao 的回复:
[quote=引用 6 楼 sdu_hanson 的回复:] [quote=引用 5 楼 weiweiqiao 的回复:] [quote=引用 3 楼 sdu_hanson 的回复:] pTableWidget->item(row, 0)->setText(QString::number(point.x())); 你这是取得QTableWidgetItem在前,设置文本在后。 取得的是空值当然会出异常了。
我的意思是通过设置
pTableWidget->setItemPrototype(new QTableWidgetItem());
是否就可以在录入信息时,自动调用项(QTableWidgetItem)的clone[/quote] 文档上说的是输入的时候可以自动创建吧, 代码里你这种写法不行[/quote] 恩,是的,我就是想在这段代码中试着用自动创建,那该怎么自动创建?:)[/quote] 看四楼 QModelIndex idx = pTableWidget->model()->index(1,1); pTableWidget->model()->setData(idx,"sdfdsfds");// 这是一种方法,你可以自己再查查看看有没有别的方法。
  • 打赏
  • 举报
回复
引用 6 楼 sdu_hanson 的回复:
[quote=引用 5 楼 weiweiqiao 的回复:] [quote=引用 3 楼 sdu_hanson 的回复:] pTableWidget->item(row, 0)->setText(QString::number(point.x())); 你这是取得QTableWidgetItem在前,设置文本在后。 取得的是空值当然会出异常了。
我的意思是通过设置
pTableWidget->setItemPrototype(new QTableWidgetItem());
是否就可以在录入信息时,自动调用项(QTableWidgetItem)的clone[/quote] 文档上说的是输入的时候可以自动创建吧, 代码里你这种写法不行[/quote] 恩,是的,我就是想在这段代码中试着用自动创建,那该怎么自动创建?:)
sdu_hanson 2014-06-03
  • 打赏
  • 举报
回复
引用 5 楼 weiweiqiao 的回复:
[quote=引用 3 楼 sdu_hanson 的回复:] pTableWidget->item(row, 0)->setText(QString::number(point.x())); 你这是取得QTableWidgetItem在前,设置文本在后。 取得的是空值当然会出异常了。
我的意思是通过设置
pTableWidget->setItemPrototype(new QTableWidgetItem());
是否就可以在录入信息时,自动调用项(QTableWidgetItem)的clone[/quote] 文档上说的是输入的时候可以自动创建吧, 代码里你这种写法不行
  • 打赏
  • 举报
回复
引用 3 楼 sdu_hanson 的回复:
pTableWidget->item(row, 0)->setText(QString::number(point.x())); 你这是取得QTableWidgetItem在前,设置文本在后。 取得的是空值当然会出异常了。
我的意思是通过设置
pTableWidget->setItemPrototype(new QTableWidgetItem());
是否就可以在录入信息时,自动调用项(QTableWidgetItem)的clone
sdu_hanson 2014-06-03
  • 打赏
  • 举报
回复
可以通过model写 QModelIndex idx = pTableWidget->model()->index(1,1); pTableWidget->model()->setData(idx,"sdfdsfds");//设置内容
sdu_hanson 2014-06-03
  • 打赏
  • 举报
回复
pTableWidget->item(row, 0)->setText(QString::number(point.x())); 你这是取得QTableWidgetItem在前,设置文本在后。 取得的是空值当然会出异常了。
  • 打赏
  • 举报
回复
引用 1 楼 feilinhe 的回复:
QTableWidget需要先insert一行才能在该行上填充数据,就像你addRow()函数里那样
你好,我按你说的先insert行(调用testtablewidget.cpp文件中的addRow方法),还是异常关闭。
feilinhe 2014-06-02
  • 打赏
  • 举报
回复
QTableWidget需要先insert一行才能在该行上填充数据,就像你addRow()函数里那样

16,175

社区成员

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

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