Use UI array in a function Qt C++

2019-09-07 15:06发布

问题:

In my Windows forms code, ui is used to define graphical element by default. But I want to modify them in a function, like this:

The problems is that the debug tool tells me that ui is not declared in this scope.

#include <QMessageBox>
#include <QFile>
#include <QTextStream>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "datawindow.h"

void getData(ui){
    QFile inputFile("C:\\pepoles.txt");
        if (inputFile.open(QIODevice::ReadOnly)){
           QTextStream in(&inputFile);



           while ( !in.atEnd() ){
              QString line = in.readLine();
              ui->listWidgetData->addItem(line);
           }
        }
        else{
            QMessageBox::critical(this, "Erreur", "Une erreur s'est produite :(");
        }
    inputFile.close();
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    getData(ui);

}

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

void MainWindow::on_actionNouvellesDonnees_triggered() {
    w.show();
}

回答1:

void getData(ui){

That line starts definition of getData function, which takes one variable, with type ui and no name (so it can't be accessed in the function code).

Add type...

void getData(MainWindow::Ui *ui){


回答2:

Make getData() a member of MainWindow:

void MainWindow::getData()
{
    QFile inputFile("C:\\pepoles.txt");
    if (inputFile.open(QIODevice::ReadOnly)) {
        QTextStream in(&inputFile);
        while ( !in.atEnd() ) {
            QString line = in.readLine();
            ui->listWidgetData->addItem(line);
        }
    } else {
        QMessageBox::critical(this, "Erreur", "Une erreur s'est produite :(");
    }
    inputFile.close();
}

Then, in your constructor:

ui->setupUi(this);
getData();

I recommend this approach since ui contains private members, so it's best to have a member function modify it.

Don't forget to declare getData() in the header file of your MainWindow class. You should probably make it private.

And btw, ui is not an array. It's an object pointer.