【问题标题】:How do I update a csv file when a cell has been updated in QTableWidget?当 QTableWidget 中的单元格已更新时,如何更新 csv 文件?
【发布时间】:2014-08-07 21:17:48
【问题描述】:

我有一个有几行的 QTableWidget。当用户编辑单元格时,我希望他们编辑的数据在 csv 文件中自动更新。我知道如何更新 csv 文件,但我不知道如何识别数据何时被编辑并将其拉出单元格。如何识别数据何时发生变化?

更新: @Gluttton - 我在主窗口内使用 QTableWidget 并使用 for 循环创建项目(见下文)。我在创建表格时覆盖了该项目。如果我不保留该项目,我该如何参考?

主类

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->updateDataSummary();
}

MainWindow::~MainWindow()
{
    delete ui;
}

....

for (int x = 0; x < rowOfData.size(); x++)
{
    rowData = rowOfData.at(x).split(",");
    if((ui->table_Data->rowCount() - x) == 0) ui->table_Data->insertRow(x);
    for (int y = 0; y < rowData.size(); y++)
    {
        QTableWidgetItem *item = new QTableWidgetItem(rowData[y],QTableWidgetItem::Type);
        if( y < 43 ) item->setFlags(item->flags() ^ Qt::ItemIsEditable);
        ui->table_Data->setItem(x,y,item);
        ui->table_Data->repaint();
    }
}

@Glutton - 感谢您的帮助!我对您在下面显示的代码进行了两次修改。您可以在下面的代码中看到我所做的更改。

connect (ui->table_Data, SIGNAL ( itemChanged(QTableWidgetItem *) ), this, SLOT ( onItemChanged(QTableWidgetItem *) ) );

....

void MainWindow::onItemChanged( QTableWidgetItem * item)
{
    // Where?
    int column = item->column ();
    int row    = item->row ();
    qDebug () << "Data in item [" << column << "] ["<< row << "was changed.";
}

【问题讨论】:

  • 基于您的更新。你不需要处理item,你需要在你的table_data 上订阅一些插槽(见下文)(看我的例子connection)。你能看到吗你能明白吗?您需要将table_dataMainWindow 连接起来。 table_data“说”你 item 发生了什么变化。
  • 我已根据您的代码重命名示例中的变量。
  • 所以我应该有类似的东西:受保护的插槽:void on_table_data_change & then connect(signal(table_data_changed...?
  • 好吧:你需要创建slot并连接它。您可以先尝试调试输出(我已经更新了我的示例 - 请参阅 onItemChanged 中的调试输出)。
  • 您的修改是正确的(还需要将onItemChanged 声明为slot)。那么它是否按预期工作或者你有什么问题?

标签: c++ qt user-interface qtablewidget qtablewidgetitem


【解决方案1】:

您应该订阅信号:

void QTableWidget::itemChanged ( QTableWidgetItem * item )

通过item您可以访问datarowcolumn

// In header file.
class MainWindow : public QWidget
{
Q_OBJECT
public:
    MainWindow (QWidget *  parent = NULL);
    QTableWidget * table_data;
...
protected slots:
    void onItemChanged ( QTableWidgetItem *);
...
};

// In source file.
#include <QDebug>

MainWindow::MainWindow (QWidget *  parent)
{
table_data = new QTableWidget (this);
connect (table_data, SIGNAL (itemChanged ( QTableWidgetItem *) ), this, slot (onItemChanged ( QTableWidgetItem *) ) );
}


void MainWindow::onItemChanged ( QTableWidgetItem * item)
{
    // Where?
    int column = item->column ();
    int row    = item->row ();
    // What?
    QVariant   = item->data ();
    qDebug () << "Data in item [" << column << "] ["<< row << "] was changed.";
}

【讨论】:

  • 要么这个要么切换到合适的模型和QTableView
  • @peppe,是的。对于QTableView,方法将类似(而不是QTableWidgetItem * 将是QStandardItemModelItem *)。不是吗?
  • 取决于您是否使用QStandardItemModel 来保存您的数据。您可以只实现一个包装 CSV 文件的自定义模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多