我有两个,一个在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);
}
}
}
现在程序编译得很好但是当我单击对话框表单上的按钮时,它会复制对话框表格中最后一个单元格中的数据,并将其粘贴到主窗口表格中的每个单元格中。如果有人能给我解释这里有什么问题以及如何解决这个问题,我将非常感激。提前谢谢。
答案 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());
}
}
}
您可以在对话框中创建一个返回表指针的函数。 单击复制按钮时,您可以从对话框中发出没有参数的信号。 将此信号连接到主窗口的一个插槽,该插槽从对话框中获取表格并调用该功能来复制项目。