Search code examples
c++qtqtablewidgetqt-signalsqtablewidgetitem

Transferring QTableWidgetItems from one tableWidget to another using a qvector


I have run into a problem with my program which I don't know how to solve. The problem is I have a Qtablewidget in two classes, and I have used the signal and slot mechanism to transfer a QVector, which contains the QTablewidgetItems from one class, and place it in the other classes QTableWidget. The problem I'm getting is that when I press the transfer button on one class, no data is transferred. Can anyone tell me what the problem is? cause i'm stumped. Code Below:

MainWindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "editmode1.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

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


~MainWindow();
protected:
    Ui::MainWindow *ui;
public slots:
void setTableDataSlot(int width, int height, QVector<QTableWidgetItem*>const& EditData);

private slots:

void on_actionEdit_Mode_triggered();

private:
EditMode1 *mEdit;
};

#endif // MAINWINDOW_H

EditMode1.h:

#ifndef EDITMODE1_H
#define EDITMODE1_H

#include <QDialog>
#include <QTableWidget>

namespace Ui {
class EditMode1;
}

class EditMode1 : public QDialog
{
Q_OBJECT

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

~EditMode1();
signals:
void setTableDataSignal(int width, int height, QVector<QTableWidgetItem*> const& EditData)

private slots:

void on_buttonBox_accepted();

void on_buttonBox_rejected();

private:
Ui::EditMode1 *Editui;


};

#endif // EDITMODE1_H

MainWindow.cpp:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QDesktopWidget>
#include <QCoreApplication>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{

ui->setupUi(this);
ui->tableWidget->setRowCount(6);         
ui->tableWidget->setColumnCount(5);      
for(int i = 0;i<ui->tableWidget->rowCount();++i){
    for(int j = 0;j<ui->tableWidget->columnCount();++j){
        QTableWidgetItem *tableitem = new QTableWidgetItem(" ");
        ui->tableWidget->setItem(i,j,tableitem);
    }
  }
}
MainWindow::~MainWindow()
{

}

void MainWindow::on_actionEdit_Mode_triggered()
{
mEdit = new EditMode1(this);
connect(mEdit,SIGNAL (setTableDataSignal(int width, int height, QVector<QTableWidgetItem*> const& EditData)),this,
                  SLOT(setTableDataSlot(int width, int height,QVector<QTableWidgetItem*>const& EditData)));
mEdit->show(); 
}

void MainWindow::setTableDataSlot(int width, int height,QVector<QTableWidgetItem*>const& EditData){
     for(int i = 0; i<height;++i){
      for(int j = 0; j<width;++j){

        QTableWidgetItem* copieditem = new QTableWidgetItem( *EditData[i*height + j]) ;
        ui->tableWidget->setItem(i,j,copieditem);
        }
    }
}

EditMode1.cpp:

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


int rows = 6;
int columns = 5;

EditMode1::EditMode1(QWidget *parent) :
QDialog(parent),
Editui(new Ui::EditMode1)
{
Editui->setupUi(this); 
 for (int i=0; i<rows;++i){
    for(int j = 0; j<columns;++j){
        QTableWidgetItem *blankitem = new QTableWidgetItem("  ");
        Editui->tableWidget->setItem(i,j,blankitem);
    }
 }
}

EditMode1::~EditMode1()
{
delete Editui;
}

void EditMode1::on_buttonBox_accepted()
{
QVector <QTableWidgetItem*> AllItems; 
for (int i=0; i<rows;++i){
    for(int j = 0; j<columns;++j){
        AllItems.push_back(Editui->tableWidget->item(i,j)); 
   }
 }
emit setTableDataSignal(columns,rows,AllItems);
}

void EditMode1::on_buttonBox_rejected()
{
reject();
}

Sorry about there being a lot of code, but I don't know what part of the program is causing it to produce nothing, and I thought with all code on display it would be easier for others to debug. Thanks in advance!


Solution

  • You probably want to signal the region dimensions with the data, so the signal should be something like:

    signals:
    void setTableDataSignal( 
        int width, int height, const QVector<QTableWidgetItem*>& EditData);
    

    To send the signal try:

    void EditMode1::on_buttonBox_accepted()
    {
        QVector <QTableWidgetItem*> AllItems;
        for (int y = 0; y < rows; ++y )
        {
            for( int x = 0; x < columns; ++x )
            {
                AllItems.push_back( Editui->tableWidget->item(x,y) );
            }
        }
    
        emit setTableDataSignal( columns, rows, AllItems );
    }
    

    In the receiving widget, you should then do something like:

    void MainWindow::setTableDataSlot( 
        int width, int height, const QVector<QTableWidgetItem*>& EditData)
    {
        for(int y = 0; y < height; ++y)
        {
            for(int x = 0; x < width; ++x)
            {
                QTableWidgetItem* copieditem = new QTableWidgetItem( *EditData[y*height + x]) ;
                ui->tableWidget->setItem( x, y, copieditem );
            }
        }
    }