信号/插槽 Qt5 C++

Signals/slots Qt5 C++

本文关键字:C++ Qt5 插槽 信号      更新时间:2023-10-16

>我和槽建立了连接,调用了函数,通过qDebug((输出了值,但是表没有变化,怎么了?

主窗口.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>

主.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>

矩阵.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>

主窗口.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>

矩阵.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>

如果我将此代码复制到构造函数中,那么一切都很好,一切都会改变,但函数没有任何效果

当不显示带有更新表的小部件时,您希望如何查看带有值的表?

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();

您将看到另一个包含更新内容的小部件。