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!
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 );
}
}
}