Qt将文本文件中的行分配给qlabels

时间:2016-05-18 12:02:59

标签: c++ qt

到目前为止有效:通过QFileDialog打开文本文件,并在Qlabel(showfile)中显示文本文件的内容。 我也有一个for-loop来计算文本文件中有多少\n。 现在我想要的是将文本文件中的一行一行分配给新的Qlabel,这意味着每个Qlabel包含一行文本文件并将其动态地放置在运行时。

也许你可以提供帮助,因为我有点被困在这里。

这是我的qwidget类,其中应放置标签:

class mywidget:public QWidget       //class for displaying everything
{
    Q_OBJECT

private:
    QGridLayout *area;
    QLabel *showfile;               //shows input from textfile
    QLabel *processname,*status;    //captionlabel
    QFont *pfont,*sfont;            //fontoption for processname&status
    QLabel **processes;             //2D array to dynamically create QLabels for each entry in file


public:
    mywidget(QWidget *parent = Q_NULLPTR, Qt::WindowFlags flags = 0):QWidget(parent,flags)
    {
        this->area = new QGridLayout(this);
        this->showfile = new QLabel(tr("Test"),this);
        this->pfont = new QFont();
        this->pfont->setPixelSize(20);
        this->sfont = new QFont();
        this->sfont->setPixelSize(20);
        this->processname = new QLabel(tr("Process_Name:"),this);
        this->processname->setFont(*pfont);
        this->status = new QLabel(tr("Status:"),this);
        this->status->setFont(*sfont);
        this->area->addWidget(this->processname,0,0,Qt::AlignHCenter);
        this->area->addWidget(this->status,0,1,Qt::AlignHCenter);
        this->area->addWidget(this->showfile,1,0,Qt::AlignHCenter);
        this->area->setSpacing(10);
    }
    ~mywidget()
    {
        delete this->area;
        delete this->showfile;
        delete this->pfont;
        delete this->sfont;
        delete this->processname;
        delete this->status;
    }
    friend class mywindow;
};

这是我在QMainwindow课程中的开放式方法:

void mywindow::oeffnen()
{
    this->openfilename = QFileDialog::getOpenFileName              //open textfile dialog
        (this,
         tr("Datei öffnen"),
         QDir::homePath(),
         "Textdateien (*.txt *.docx *.doc);;" "Alle Dateien (*.*)"
         );

    if(!this->openfilename.isEmpty())
    {
        this->file = new QFile(this->openfilename);
        this->file->open(QIODevice::ReadOnly);
        this->stream = new QTextStream(this->file);
        this->fileread = this->stream->readAll();



        for(int z = 0;z<this->fileread.length();++z)                //check entries in string by counting \n
        { 
            this->eintraege = this->fileread.count(QRegExp("\n"));
        }
        //this->s_eintraege = QString::number(this->eintraege);       //converting to string for displaying





        this->central->showfile->setText(this->fileread);           //assign filecontent to label



        if(!this->file->isReadable())
        {
            QMessageBox::information(this,
                                     tr("Fehler"),
                                     tr("Konnte Datei %1 nicht laden!").arg(this->openfilename)
                                     );
        }
        else
        {
            QMessageBox::information(this,
                                     tr("OK"),
                                     tr("Konnte Datei %1 laden!").arg(this->openfilename)
                                     );
        }
        this->file->close();    
    }
}

1 个答案:

答案 0 :(得分:1)

您可以为从文件中读取的每个新行添加新的QLabel到布局中。您可以将标签存储在container QVector中,以便稍后访问其文字。这是一个例子:

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QFile>
#include <QLayout>
#include <QTextStream>
#include <QDebug>

class DisplayWidget : public QWidget
{
    Q_OBJECT

public:
    DisplayWidget(QWidget *parent = 0) : QWidget(parent)
    {
        labelLayout = new QVBoxLayout;
        setLayout(labelLayout);
        resize(200, 200);
    }
    void addLabel(const QString &text)
    {
        QLabel *label = new QLabel(text);
        label_vector.append(label);
        labelLayout->addWidget(label);
    }
    void readFile(const QString &filename)
    {
        QFile file(filename);
        if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;
        QTextStream ts(&file);
        while(!ts.atEnd())
        {
            QString line = ts.readLine();
            if(!line.isEmpty())
                addLabel(line);
        }
    }
    QString getLabelText(int index)
    {
        if(label_vector.size() > index)
            return label_vector[index]->text();
        return QString();
    }

private:
    QVBoxLayout *labelLayout;
    QVector<QLabel*> label_vector;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    DisplayWidget w;
    w.readFile("somefile.txt");
    w.show();
    qDebug() << w.getLabelText(3);

    return a.exec();
}

#include "main.moc"