Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt GUI _ Правильно написать функцию в GUI проге

Автор: Aleksei 3.9.2014, 20:24

в консоле получалась функция, а тут не знаю как.
mainwindow.h
добавил

private:
    void mFile(QString file);


mainwindow.cpp
добавил

void MainWindow::mFile(QString file) //моя функция
{
}
void MainWindow::on_pushButton_clicked() //выбор файла
{
    QString str = QFileDialog::getOpenFileName(this, "Выбрать файл", "", "*.txt");
    mFile(str); //передал значение в функцию
}
void MainWindow::on_pushButton_2_clicked() //вывод свойства файла
{
         QFileInfo info(mFile());
         ui->label_2->setText("Имя файла: " +info.fileName());
}


как правильно оформить функцию?

Автор: marsel 4.9.2014, 7:50

Слушай ты бы хоть, какой нибудь учебник по С++ почитал.

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

private:
QString fileName

Вот здесь QFileInfo info(mFile());

Во первых функция mFile(QString file) не возвращает ничего void. Зачем тогда она здесь?
И во вторых у этой функции есть обязательный параметр.

Читать и учить.

Автор: Aleksei 4.9.2014, 21:19

разобрался с функциями

void MainWindow::on_action_1_triggered()
{
    mFile = QFileDialog::getOpenFileName(this, "Выбрать файл", "", "*.txt");
    if(!mFile.isEmpty())
    {
     ui->statusBar->showMessage("Выбран файл",1500);
     ui->svoistvaButton->setEnabled(true);
    }
    else QMessageBox::information(this, "Ошибка", "Для начала нужно выбрать файл");
    return;

}

void MainWindow::on_svoistvaButton_clicked()
{
    QFileInfo info(mFile);
    ui->label->setText("Имя файла: " + info.fileName());
    ui->label_2->setText("Размер файла: " + QString::number(info.size()/1024) + " Кб");
    ui->label_3->setText("Дата изменения: " + info.lastModified().toString());
}

void MainWindow::on_pushButton_2_clicked()
{
    QFile oFile(mFile);
    if(!oFile.open(QFile::ReadOnly | QFile::Text))
    {
       QMessageBox::information(this, "Ошибка", "Ошибка открытия для чтения");
       return;
    }
    QTextStream stream(&oFile);
    QString buffer = stream.readAll();
    ui->textEdit->setText(buffer);
}
void MainWindow::on_pushButton_3_clicked()
{
    QFile cFile(mFile);
    cFile.close();
}
void MainWindow::on_pushButton_clicked()
{
    QFile iFile(mFile);
    if (iFile.open(QFile::isOpen())==true)
        {
          ui->statusBar->showMessage("Файл открыт",1500);
        }
    else ui->statusBar->showMessage("Файл закрыт",1500);
}

void MainWindow::on_action_2_triggered()
{
    close();
}

проверка открыт ли файл не работает if (iFile.open(QFile::isOpen())==true) ругается на эту строчку.
если писать if (iFile.isOpen()== true) тоже не работает. Запускается без ошибки но результат всегда закрыт файл.

Автор: FireBlack 5.9.2014, 4:56

Цитата(Aleksei @ 4.9.2014, 22:19) *
если писать if (iFile.isOpen()== true) тоже не работает. Запускается без ошибки но результат всегда закрыт файл.

Вам явно не хватает знаний языка, и как уже советовали выше - стоит почитать литературу. Я бы порекомендовал http://www.proklondike.com/books/cpp/lafore_oop_v_cpp.html, данная книженция чертовки помогла мне в свое время.

QFile iFile(mFile);
if (iFile.isOpen()== true)
Данная конструкция всегда будет возвращать false т.к. вы поверяете открытость не mFile, а открытость объекта iFile, для которого функция open не вызывалась. iFile, cFile и oFile - это совершенно разные переменные, между собой никак не связанные.

void MainWindow::on_pushButton_3_clicked()
{
    QFile cFile(mFile);
    cFile.close();
}
Данная конструкция вообще лишена смысла т.к. вы пытаетесь закрыть еще не открытый файл. Поймите, Вы работаете не с файлом mFile (это всего лишь путь к файлу, а не его handle), а с локальным объектом QFile, который создаете на стеке и который будет уничтожен при выходе из функции, например здесь:
void MainWindow::on_pushButton_2_clicked()
{
    QFile oFile(mFile);
    if(!oFile.open(QFile::ReadOnly | QFile::Text))
    {
       QMessageBox::information(this, "Ошибка", "Ошибка открытия для чтения");
       return;
    }
    QTextStream stream(&oFile);
    QString buffer = stream.readAll();
    ui->textEdit->setText(buffer);
}    //<- вот здесь объект oFile будет уничтожен, и закрытие файла произойдет автоматически.


Если Вы хотите управлять объектом QFile вручную, то Вам следует вынести его в члены класса, например:
Раскрывающийся текст

где то в .h файле:
QFile _file;

в .cpp файле:
void MainWindow::on_action_1_triggered()
{
    QString fileName = QFileDialog::getOpenFileName(this, "Выбрать файл", "", "*.txt");
    if(!fileName.isEmpty())
    {
         ui->statusBar->showMessage("Выбран файл",1500);
         ui->svoistvaButton->setEnabled(true);
         _file.setFileName(fileName);
    }
    else QMessageBox::information(this, "Ошибка", "Для начала нужно выбрать файл");
    return;

}

void MainWindow::on_svoistvaButton_clicked()
{
    QFileInfo info(_file);
    ui->label->setText("Имя файла: " + info.fileName());
    ui->label_2->setText("Размер файла: " + QString::number(info.size()/1024) + " Кб");
    ui->label_3->setText("Дата изменения: " + info.lastModified().toString());
}

void MainWindow::on_pushButton_2_clicked()
{
    if(!_file.isOpen() && !_file.open(QFile::ReadOnly | QFile::Text))
    {
       QMessageBox::information(this, "Ошибка", "Ошибка открытия для чтения");
       return;
    }
    QTextStream stream(&_file);
    QString buffer = stream.readAll();
    ui->textEdit->setText(buffer);
}
void MainWindow::on_pushButton_3_clicked()
{
    _file.close();
}
void MainWindow::on_pushButton_clicked()
{
    if (_file.isOpen())
        ui->statusBar->showMessage("Файл открыт",1500);
    else
        ui->statusBar->showMessage("Файл закрыт",1500);
}

Однако такой подход не является правильным т.к. файл у Вас открыт слишком долго. Обычно файлы закрываются сразу после использования (например, чтения или записи), чтобы другие приложения тоже имели к ним доступ.

Автор: Litkevich Yuriy 5.9.2014, 14:47

Aleksei, Вам нужно прекращать обезьяничать с визуальным дизайнером. В частности с автоматическим созданием слотов.

Что делает эта функция :
void MainWindow::on_pushButton_3_clicked()

А эта?
void MainWindow::on_pushButton_500_clicked()


Функции и переменные должны в своём названии отражать суть, никаких pushButton_3 быть не может.
Привыкайте сразу писать код для людей, а не для компилятора.

Представьте себя в лифте, в котором кнопки обозваны, как у вас, например вместо кнопок Стоп и Вызов - pushButton_18 и pushButton_43


Цитата(FireBlack @ 5.9.2014, 7:56) *
//<- вот здесь объект oFile будет уничтожен, и закрытие файла произойдет автоматически.
+ много! Это очень важно!
Aleksei, вам книжку путнюю по Си++ надо держать под рукой
На начальном этапе может http://www.ozon.ru/person/265199/?group=div_bookподойти (но если будете вникать вам её покажется мало), а отечественных авторов лучше не брать, они сами нифига не понимают.

Автор: FireBlack 5.9.2014, 15:30

Цитата(Litkevich Yuriy @ 5.9.2014, 15:47) *
Aleksei, Вам нужно прекращать обезьяничать с визуальным дизайнером. В частности с автоматическим созданием слотов.

Предлагаю компромиссное решение: использовать автоматическое создание слотов только для переименованных объектов. Например, QPushButton кнопку, при нажатии на которую выбирается файл - именовать pbnSelectFileName. Тогда слот будет выглядеть void MainWindow::on_pbnSelectFileName_clicked(), по-моему вполне читабельно. Поле ввода QLineEdit, куда Вы выводите имя файла именовать leFileName и так далее.
ИМХО: подобное решение позволяет использовать все плюшки дизайнера и не снижает читабельности кода.

Цитата(Litkevich Yuriy @ 5.9.2014, 15:47) *
Функции и переменные должны в своём названии отражать суть, никаких pushButton_3 быть не может.
Привыкайте сразу писать код для людей, а не для компилятора.

А вот с этим я полностью согласен, красиво сказано.

Автор: Aleksei 5.9.2014, 16:05

спасибо учту.
Такой вопрос: если с текстовым файлом постоянно работает система и ей нельзя мешать (допустим лог файл) в этом текст. файле нужно искать запись (допустим Error 100) файл довольно большой. Как лучше реализовать? Прямиком по файлу запустить поиск или через буфер или копию файла сделать, запустить поиск и потом его удалить? что меньше нагрузит систему и не помещает системе писать в этот файл?

Автор: FireBlack 5.9.2014, 17:27

Цитата(Aleksei @ 5.9.2014, 17:05) *
если с текстовым файлом постоянно работает система и ей нельзя мешать (допустим лог файл) в этом текст. файле нужно искать запись (допустим Error 100) файл довольно большой. Как лучше реализовать?

Просто периодически по таймеру или по сигналу от http://qt-project.org/doc/qt-5/qfilesystemwatcher.html открываете этот файл для чтения, читаете его кусками и ищете искомую запись. Если, как Вы говорите, это большой лог файл (который только дополняется), то имеет смысл запоминать последнюю http://qt-project.org/doc/qt-5/qiodevice.html#pos и при следующем чтении файла http://qt-project.org/doc/qt-5/qiodevice.html#seek.

Автор: Litkevich Yuriy 6.9.2014, 10:07

Цитата(FireBlack @ 5.9.2014, 18:30) *
Например, QPushButton кнопку, при нажатии на которую выбирается файл - именовать pbnSelectFileName. Тогда слот будет выглядеть void MainWindow::on_pbnSelectFileName_clicked(), по-моему вполне читабельно.
да, тоже вариант

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)