Qt - 将QTableWidget的数据更改为另一个类的QTableWidget数据

时间:2016-03-02 21:01:24

标签: c++ qt qtablewidget qtablewidgetitem

我有两个,一个在MainWindow ui,另一个在Dialog ui上。我想要做的是从对话框中复制数据并将其粘贴到MainWindow中。我试图做的是使用Qt的Slot&Signals机制来复制数据。以下是我尝试使用的代码:

MainWindow.h:

#include "ui_mainwindow.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT

public:   
explicit MainWindow(QWidget *parent = 0);


~MainWindow();

public slots:
void SetTableDataSlot(QTableWidgetItem* EditData);
}

MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
Dialog *dialog;

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

MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
dialog = new Dialog(this);
connect(mEdit,SIGNAL(setTableDataSignal(QTableWidgetItem*)),
                 this,SLOT(setTableDataSlot(QTableWidgetItem*)));
dialog->show();
}

void MainWindow::setTableDataSlot(QTableWidgetItem* EditData){
for(int i = 0; i<ui->tableWidget->rowCount();++i){
    for(int j = 0; j<ui->tableWidget->columnCount();++j){
        ui->tableWidget->setItem(i,j,EditData->clone());
    }
  }
}

Dialog.h:

#include <QDialog>
#include <QTableWidget>


namespace Ui {
class dialog;
}

class dialog : public QDialog
{
Q_OBJECT

public:
explicit dialog(QWidget *parent = 0);

~dialog();
signals:
void setTableDataSignal(QTableWidgetItem *EditData);
}

Dialog.cpp:

#include "ui_mainwindow.h"
#include "mainwindow.h"
#include "editmode1.h"
#include "ui_editmode1.h"

Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}

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

void Dialog::on_pushButton_clicked()
{
for (int i=0; i<rows;++i){
    for(int j = 0; j<columns;++j){
        emit setTableDataSignal(ui->tableWidget->item(i,j);
    }
  }
}

现在程序编译得很好但是当我单击对话框表单上的按钮时,它会复制对话框表格中最后一个单元格中的数据,并将其粘贴到主窗口表格中的每个单元格中。如果有人能给我解释这里有什么问题以及如何解决这个问题,我将非常感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的错误就在这一行:

ui->tableWidget->setItem(i,j,&EditData);

您传递一个存在于堆栈中的对象的指针,并将在setTableDataSlot的末尾销毁。您还试图在所有表格单元格中设置相同的对象。

您必须为每个单元格创建一个新的QTableWidgetItem

逻辑也是错误的,因为你正在复制表A的每个单元格,将每个副本放入表B的所有单元格(B的所有单元格中的单元格[0,0],而不是单元格[0,1]] B的所有细胞中的A等等。

我建议改变方法(例如从主窗口获取对话框表并复制单元格,而不通过信号槽传递所有QTableWidgetItem)

修改

您可以使用此功能将QTableItems从表复制到另一个表(未测试)

void copyTableContents(QTableWidget* sourceTable, QTableWidget* destTable)
{
    for(int r = 0; r < sourceTable->rowCount() && r < destTable->rowCount(); ++r)
    {
        for(int c = 0; c < sourceTable->columnCount() && c < destTable->columnCount(); ++c)
        {
            //delete old item if exists
            QTableWidgetItem* dItem = destTable->takeItem(r, c);
            if(dItem)
                delete dItem;
            QTableWidgetItem* sItem = sourceTable->item(r, c);
            if(sItem) //copy the item if exists
                destTable->setItem(r, c, sItem->clone());
        }
    }
}

您可以在对话框中创建一个返回表指针的函数。 单击复制按钮时,您可以从对话框中发出没有参数的信号。 将此信号连接到主窗口的一个插槽,该插槽从对话框中获取表格并调用该功能来复制项目。