Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt-更改QTableWidget';将数据传输到另一个类';s QTableWidget';s数据_C++_Qt_Qtablewidget_Qtablewidgetitem - Fatal编程技术网

C++ Qt-更改QTableWidget';将数据传输到另一个类';s QTableWidget';s数据

C++ Qt-更改QTableWidget';将数据传输到另一个类';s QTableWidget';s数据,c++,qt,qtablewidget,qtablewidgetitem,C++,Qt,Qtablewidget,Qtablewidgetitem,我有两个,一个在主窗口ui上,另一个在对话框ui上。我要做的是从对话框中复制数据并粘贴到主窗口中。我试着使用Qt的Slot和Signals机制来复制数据。下面是我尝试使用的代码: MainWindow.h: #include "ui_mainwindow.h" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWi

我有两个,一个在主窗口ui上,另一个在对话框ui上。我要做的是从对话框中复制数据并粘贴到主窗口中。我试着使用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());
    }
  }
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括“dialog.h”
对话*对话;
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在按钮上单击()
{
dialog=新建对话框(此对话框);
连接(mEdit,信号(setTableDataSignal(QTableWidgetItem*)),
这个插槽(setTableDataSlot(QTableWidgetItem*));
对话框->显示();
}
void主窗口::setTableDataSlot(QTableWidgetItem*EditData){
对于(int i=0;itableWidget->rowCount();++i){
对于(int j=0;jtableWidget->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);
}
#包括
#包括
名称空间用户界面{
类对话框;
}
类对话框:公共QDialog
{
Q_对象
公众:
显式对话框(QWidget*parent=0);
~dialog();
信号:
作废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);
    }
  }
}
#包括“ui_mainwindow.h”
#包括“mainwindow.h”
#包括“editmode1.h”
#包括“ui_editmode1.h”
Dialog::Dialog(QWidget*父项):
QDialog(父级),
ui(新建ui::对话框)
{
用户界面->设置用户界面(此);
}
对话::~Dialog()
{
删除用户界面;
}
无效对话框::在按钮上单击()
{
对于(int i=0;i项(i,j);
}
}
}

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

您的错误在哪里这一行:

ui->tableWidget->setItem(i,j,&EditData);
您传递了位于堆栈中的对象的指针,该对象将在
setTableDataSlot
的末尾被销毁。此外,您还试图在所有表单元格中设置相同的对象

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

此外,逻辑也是错误的,因为您正在复制表A的每个单元格,并将每个副本放入表B的所有单元格中(B的所有单元格中A的单元格[0,0],而不是B的所有单元格中A的单元格[0,1],依此类推)

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

编辑

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

void copyTableContents(QTableWidget*sourceTable,QTableWidget*destTable)
{
对于(int r=0;rrowCount()&&rrowCount();++r)
{
对于(int c=0;ccolumnCount()&&ccolumnCount();++c)
{
//删除旧项目(如果存在)
QTableWidgetItem*dItem=destTable->takeItem(r,c);
如果(dItem)
删除数据项;
QTableWidgetItem*sItem=sourceTable->item(r,c);
if(sItem)//如果存在,则复制该项
destable->setItem(r、c、sItem->clone());
}
}
}
您可以在对话框中创建一个返回表指针的函数。 单击“复制”按钮时,可以从对话框发出无参数的信号。
将此信号连接到从对话框中获取表格的主窗口的一个插槽,并调用该函数来复制项目。

我收到一个SIGSEGV错误,但现在在线
ui->tableWidget->setItem(I,j,EditData->clone())
。可能某些单元格为空。现在我发现逻辑也完全错误。我对qt不太好,我该如何从对话框屏幕复制单元格?这就是我试图做的,但我不知道如何避免sigsegv错误,请帮助。感谢您指出逻辑中的错误。sigsegv错误可能是代码中的C++错误引起的BLY。我需要更多的代码来研究(例如,我不理解EdjMod 1类的角色以及如何创建对话框中的表)。还必须检查ItMe()方法返回的QTable WistGeTyTrm不是Null。您还需要查看什么?(编辑模式位我已经编辑出来了,这里不需要。(正如您现在所猜测的那样,整个代码是从更大的代码块中剥离出来的)),我只是通过在qt表单设计器上拖动它们并分别在构造函数中编辑它们来创建表,使用setRowCount和setColumnCount等函数来创建适当的表大小。从解释您正试图实现的目标开始。我可以看到描述“它不能像我想要的那样工作”但是你想要的只是一些零碎的信息。对不起,我想我说得很好。它也在标题中表达了我想要的,对不起,但我不太同意你的说法,请指出我可以改进的地方,我很乐意这样做,谢谢!两个小部件是否显示完全相同的信息?winch是同步的?在这种情况下,通过整个data模型将在一行中完美解决问题。单击按钮时,两个小部件应显示相同的信息。如何在一行中准确解决此问题?谢谢。
widgetB->setModel(widgetA->model());
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());
        }
    }
}