crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Правильно написать функцию в GUI проге, Передача параметров между кнопками.
Aleksei
  опции профиля:
сообщение 3.9.2014, 20:24
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


в консоле получалась функция, а тут не знаю как.
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
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 15
Регистрация: 29.1.2013
Пользователь №: 3693

Спасибо сказали: 3 раз(а)




Репутация:   0  


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

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

private:
QString fileName

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

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

Читать и учить.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Aleksei
  опции профиля:
сообщение 4.9.2014, 21:19
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


разобрался с функциями
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
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 17.10.2010
Из: г.Пенза
Пользователь №: 2121

Спасибо сказали: 13 раз(а)




Репутация:   1  


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

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

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
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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, вам книжку путнюю по Си++ надо держать под рукой
На начальном этапе может Герберт Шилдт подойти (но если будете вникать вам её покажется мало), а отечественных авторов лучше не брать, они сами нифига не понимают.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FireBlack
  опции профиля:
сообщение 5.9.2014, 15:30
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 17.10.2010
Из: г.Пенза
Пользователь №: 2121

Спасибо сказали: 13 раз(а)




Репутация:   1  


Цитата(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
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 23
Регистрация: 3.9.2014
Пользователь №: 4219

Спасибо сказали: 0 раз(а)




Репутация:   0  


спасибо учту.
Такой вопрос: если с текстовым файлом постоянно работает система и ей нельзя мешать (допустим лог файл) в этом текст. файле нужно искать запись (допустим Error 100) файл довольно большой. Как лучше реализовать? Прямиком по файлу запустить поиск или через буфер или копию файла сделать, запустить поиск и потом его удалить? что меньше нагрузит систему и не помещает системе писать в этот файл?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FireBlack
  опции профиля:
сообщение 5.9.2014, 17:27
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 38
Регистрация: 17.10.2010
Из: г.Пенза
Пользователь №: 2121

Спасибо сказали: 13 раз(а)




Репутация:   1  


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

Просто периодически по таймеру или по сигналу от QFileSystemWatcher открываете этот файл для чтения, читаете его кусками и ищете искомую запись. Если, как Вы говорите, это большой лог файл (который только дополняется), то имеет смысл запоминать последнюю позицию и при следующем чтении файла начинать с нее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 6.9.2014, 10:07
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 20:20