信号/插槽QT5 C ++

问题描述 投票:-1回答:1

我已经建立了与插槽的连接,该函数被调用,并通过qDebug值()输出,但表不发生变化,有什么不好?

mainwindow.cpp

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

    ui->setupUi(this);

   ui->tableWidget->horizontalHeader()->hide();
   ui->tableWidget->verticalHeader()->hide();

    //Matrix *matr=new Matrix;
}

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

void MainWindow::on_updateTbl(int **mas, int n){
    for(int i=0;i<n;i++){
        ui->tableWidget->insertRow(ui->tableWidget->rowCount());
        for(int j=0;j<n;j++){
            ui->tableWidget->insertColumn(ui->tableWidget->columnCount());

            ui->tableWidget->setItem(i,j,new QTableWidgetItem( QString::number(mas[i][j])));
        }
    }
}

</pre>

main.cpp中

<pre>
#include "mainwindow.h"
#include <QApplication>
#include "matrix.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    Matrix matr;
    MainWindow mywnd;

    QObject::connect(&matr,SIGNAL(updateTbl(int**,int)), &mywnd, SLOT(on_updateTbl(int**,int)));

    matr.upTable();

    return a.exec();
}
</pre>

matrix.cpp

<pre>
#include "matrix.h"

#include <QFile>
#include <QDebug>
#include <QString>
#include <QTextStream>

Matrix::Matrix()
{
    QFile file("mas.txt");

    this->mas=alloc_mem(n,n);


    array_to_file(file,n,n);
    fill_array(file,mas,n,n);

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if (mas[i][j]!=mas[n-j-1][n-i-1]) {
                symmetrical=false;
                break;
            }
        }
    }

    if(symmetrical){
        for(int i=0;i<n;i++){
            mas[i][i]=0;
            mas[i][n-i-1]=0;
        }
        //print(mas,n,"Измененная");
    }

    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(mas[i][j]) vec.append(mas[i][j]);
        }

    }

}

int** Matrix::alloc_mem(int height, int width){
    int** mas = new int*[height];
    for (int i = 0; i < height; i++) {
        mas[i] = new int[width];
    }
    return mas;
}

void Matrix::array_to_file(QFile &file, int height, int width){
    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
        return;
    int to_mas;
    QTextStream out(&file);
    for (int i = 0; i < height; i++){
        for (int j = i + 1; j < width; j++){
            to_mas=rand()%100-50;
            out<<to_mas<<" ";
        }
        out<<1<<" ";
        out<<"\n";
    }
    file.close();
}

void Matrix::fill_array(QFile &file, int **mas, int height, int width){
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        return;
    QTextStream in(&file);
    QStringList matr = in.readAll().split("\n");
    for (int i = 0; i < height; i++){
        for (int j = 0; j < width-i; j++){
            mas[i][j]=matr.at(i).split(" ").at(j).toInt();
            mas[height-1-j][width-1-i]=mas[i][j];
        }
    }

    file.close();
}

void Matrix::print(int **mas, int n, QString name){
    for(int i=0;i<n;i++){

        for(int j=0;j<n;j++){

        }
    }
}

void Matrix::upTable(){
    emit updateTbl(mas,n);
}
</pre>

mainwindow.h

<pre>
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;
private slots:
    void on_updateTbl(int**,int);
};

#endif // MAINWINDOW_H
</pre>

matrix.h

<pre>
#ifndef MATRIX_H
#define MATRIX_H

#include <QVector>
#include <QFile>
#include <QString>
#include <QObject>

class Matrix:public QObject
{
    Q_OBJECT

public:
    Matrix();
    ~Matrix(){}
    //bool check_symmetrical(int **mas,int n);
    void print_vector(QVector<int> vector);
    int** alloc_mem(int height,int width);
    void array_to_file(QFile& file,int height,int width);
    void fill_array(QFile& file,int **mas,int height,int width);
    void print(int** mas,int n,QString name);
    void upTable();
private:
    int n=10;
    int **mas;
    bool symmetrical=true;
    QVector<int> vec;
signals:
    void updateTbl(int**,int);

};

#endif // MATRIX_H
</pre>

如果我这个代码复制到构造函数,那么一切都很好,一切都改变了,但没有从功能的工作原理

c++ c++11
1个回答
0
投票

你怎么想看到的值表时,不显示与更新的表格部件?

MainWindow w;
w.show();    // <--- w is displayed, tableWidget is not modified in this widget

Matrix matr;
MainWindow mywnd; // <--- mywnd is not displayed

QObject::connect(&matr,SIGNAL(updateTbl(int**,int)), &mywnd, SLOT(on_updateTbl(int**,int)));
                                                   // mywnd is updated 
matr.upTable();

mywnd.show();

你会看到其他小部件更新的内容。

© www.soinside.com 2019 - 2024. All rights reserved.