2015-03-29 2 views
-1

Я изменил пример Text Finder, который я получил из Qt Tutorial, и сделал Text Viewer. В этой программе пользователь вводит адрес в файл и нажимает кнопку «Поиск». Затем программа отображает содержимое текстового файла. Ниже мой код. text_finder.cpp:Как получить имя файла в Qt?

#include "text_finder.h" 
#include "ui_text_finder.h" 
#include <QHBoxLayout> 
#include <QFile> 
#include <QTextStream> 
#include <QFileDialog> 

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

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

void Text_Finder::loadFile(QFile file){ // I have to pass the file name as parameter. 
    QFile inputFile(file); 
    inputFile.open(QIODevice::ReadOnly); 
    QTextStream in(&inputFile); 
    QString line = in.readAll(); 
    inputFile.close(); 

    ui->read->setText(line); 
    QTextCursor cursor = ui->read->textCursor(); 
    cursor.movePosition(QTextCursor::Start, QTextCursor::MoveAnchor, 1); 
} 

void Text_Finder::on_search_clicked() 
{ 
// Code that gets the path from the text box. 
    loadFile();//Parameters not passed yet. 
} 

Я еще не ввел код, который получает имя файла из адреса в текстовом поле. Мне придется передать файл функции loadFile(), которая будет вводить содержимое в текстовое редактирование в центре программы. Я хочу, чтобы решение получило имя файла, из которого пользователь вводит. Например, пользователь может ввести «/home/user/input.txt». Программа должна получить содержимое этого файла и переслать его на loadFile(). Требуется решение с объяснением того, как работают различные части. Я использую Qt Creator на Ubuntu 15.04 (бета).

+0

Как насчет 'QFileDialog :: getOpenFileName'? – LogicStuff

+0

Как это использовать? –

+0

Все это хорошо документировано. Просто Google. – LogicStuff

ответ

0

Если вы не собираетесь редактировать некоторые программы, вам не нужно использовать QTextCursor.

Я предлагаю вам ознакомиться с справочным руководством, прежде чем пытаться продолжить работу, поскольку ясно, что вы не знакомы с основными принципами графических виджета, которые вы используете.

Если вы только читаете в имени файла, а затем отображаете содержимое в текстовом формате, это все, что вам нужно сделать. (Я предполагаю, что ваше имя файл вводится в QLineEdit виджет и ui->read является QTextEdit виджетом)

void Text_Finder::loadFile(QString const &filename){ // I have to pass the file name as parameter. 
    QFile inputFile(filename); 
    inputFile.open(QIODevice::ReadOnly); 
    QTextStream in(&inputFile); 
    QString contents = in.readAll(); 
    inputFile.close(); 

    ui->read->setPlainText(contents); 
} 

void Text_Finder::on_search_clicked() 
{ 
    QString filename = ui->filename->text(); 
    loadFile(filename); 
} 

EDIT: Я создал полнофункциональный римейк вашего кода, с учетом изменений предложил я. Я собрал и протестировал его, и он работает согласно вашему описанию.

Примечание: В отсутствие вашего пользовательского интерфейса я создал пользовательский интерфейс вручную.

text_finder.h

#ifndef TEXT_FINDER_H 
#define TEXT_FINDER_H 

#include <QMainWindow> 

class QLineEdit; 
class QTextEdit; 

class Text_Finder : public QMainWindow{ 
    Q_OBJECT 
public: 
    Text_Finder(QWidget *parent = 0); 
    ~Text_Finder(); 

public slots: 
    void on_search_clicked(); 

private: 
    void loadFile(QString const &filename); 

    QLineEdit *txtFileName; 
    QTextEdit *txtFileContents; 
}; 

#endif // TEXT_FINDER_H 

main.cpp

#include "text_finder.h" 
#include <QApplication> 
#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QPushButton> 
#include <QLineEdit> 
#include <QTextEdit> 
#include <QFile> 
#include <QTextStream> 

Text_Finder::Text_Finder(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    QWidget *ui = new QWidget(this); 
    QHBoxLayout *hLayout = new QHBoxLayout; 
    txtFileName = new QLineEdit(this); 
    QPushButton *loadButton = new QPushButton("Load File", this); 
    connect(loadButton, &QPushButton::clicked, this, &Text_Finder::on_search_clicked); 
    hLayout->addWidget(txtFileName); 
    hLayout->addWidget(loadButton); 

    QVBoxLayout *vLayout = new QVBoxLayout(this); 
    vLayout->addLayout(hLayout); 
    txtFileContents = new QTextEdit(this); 
    vLayout->addWidget(txtFileContents); 

    ui->setLayout(vLayout); 

    setCentralWidget(ui); 
} 

Text_Finder::~Text_Finder(){ 
    // It's not necessary to explicitly delete any widgets. 
    // QObject implements the Composite Pattern, which takes care of all this automatically 
} 

void Text_Finder::loadFile(QString const &filename){ 
    QFile inputFile(filename); 
    inputFile.open(QIODevice::ReadOnly); 
    QTextStream in(&inputFile); 
    QString contents = in.readAll(); 
    inputFile.close(); 

    txtFileContents->setPlainText(contents); 
} 

void Text_Finder::on_search_clicked() 
{ 
    QString filename = txtFileName->text(); 
    loadFile(filename); 
} 

int main(int argc, char **argv){ 
    QApplication app(argc, argv); 
    Text_Finder w; 
    w.show(); 

    return app.exec(); 
} 

ПОДСКАЗКА для будущих вопросов: Вы получите лучшие ответы быстрее, если вы включите в свой вопрос в SSCCE. То, что я включил в это редактирование, является подходящим примером.

+0

Как вы вводите имена файлов в текстовое поле? – RobbieE

1

Если вы правильно поняли, пользователь вводит полный путь или адрес файла в текстовое поле, и вы хотите получить только имя файла из полного пути, введенного пользователем.

EDIT: Я понял, что использование QFileDialog было идеальным способом получить имя файла. Таким образом, этот - это то, как я переработал весь код;

text_finder.h

#ifndef TEXT_FINDER_H 
#define TEXT_FINDER_H 

#include <QDialog> 

#include <QVBoxLayout> 
#include <QHBoxLayout> 
#include <QPushButton> 
#include <QLineEdit> 
#include <QTextEdit> 
#include <QFile> 
#include <QTextStream> 
#include <QFileDialog> 

class Text_Finder : public QWidget{ 
    Q_OBJECT 
public: 
    Text_Finder(QWidget *parent = 0); 
    ~Text_Finder(); 

public slots: 
    void on_search_clicked(); 
    void open(); 
    //void loadFile(QString const &filename); 

private: 
    void loadFile(QString const &filename); 

    QLineEdit *txtFileName; 
    QTextEdit *txtFileContents; 
    QString fileName; 
    QPushButton *search; 
    QPushButton *openFile; 
}; 

#endif 

mainwindow.h

#ifndef MAINWINDOW_H 
#define MAINWINDOW_H 

#include <QMainWindow> 

class MainWindow : public QMainWindow { 
    Q_OBJECT 
public: 
    explicit MainWindow(QWidget *parent = 0); 
    ~MainWindow(); 
}; 

#endif // MAINWINDOW_H 

text_finder.cpp

#include "text_finder.h" 

Text_Finder::Text_Finder(QWidget *parent) : QWidget(parent) { 

    openFile = new QPushButton("Open File"); 
    connect(openFile, SIGNAL(clicked()), this, SLOT(open())); 

    txtFileName = new QLineEdit; 

    search = new QPushButton("&Search"); 

    txtFileContents = new QTextEdit; 

    QHBoxLayout *dialogAndViewLayout = new QHBoxLayout; 
    dialogAndViewLayout->addWidget(openFile); 
    dialogAndViewLayout->addWidget(txtFileName); 
    dialogAndViewLayout->addStretch(); 
    dialogAndViewLayout->addWidget(search); 

    QVBoxLayout *layout = new QVBoxLayout; 
    layout->addLayout(dialogAndViewLayout); 
    layout->addWidget(txtFileContents); 

    connect(search, SIGNAL(clicked()), this, SLOT(on_search_clicked())); 

    setLayout(layout); 

} 

Text_Finder::~Text_Finder(){ 
    delete txtFileName; 
    delete txtFileContents; 
    delete search; 
    delete openFile; 
} 

void Text_Finder::loadFile(QString const &filename){ 
    QFile inputFile(filename); 
    inputFile.open(QIODevice::ReadWrite | QIODevice::Text); 
    QTextStream textStream(&inputFile); 
    QString contents = textStream.readAll(); 
    inputFile.close(); 

    txtFileContents->setPlainText(contents); 
} 

void Text_Finder::on_search_clicked() { 

    loadFile(fileName); 
} 

/*this slot opens a file dialog. After the file has been selected, it sets  
    the file to the text text edit box*/ 
void Text_Finder::open() { 
    fileName = QFileDialog::getOpenFileName(this, "Open text", "/home/",  
    ""); 
    txtFileName->setText(fileName); 
} 

MainWindow.каст

#include "mainwindow.h" 
#include "text_finder.h" 

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { 
    Text_Finder *textFinder = new Text_Finder; 

    setCentralWidget(textFinder); 
} 

MainWindow::~MainWindow() { 

} 

Наконец main.cpp

#include "text_finder.h" 
#include <QApplication> 

int main(int argc, char **argv){ 
    QApplication app(argc, argv); 
    Text_Finder *window = new Text_Finder; 
    window->show(); 

    return app.exec(); 
} 
+0

Я пробовал это сейчас, это тоже не работает. Можете ли вы дать обновленную версию моего кода, который будет работать? –

+0

@VishalSubramanyamRajesh, но я надеюсь, что мое понимание вашего вопроса именно то, что вы имели в виду –

+0

Вы понимаете мою проблему. Код, который вы дали, не работает. Если у вас есть Ubuntu, я могу дать вам ссылку на мой исполняемый файл и файлы кода. –