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());
}


как правильно оформить функцию?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Aleksei
  опции профиля:
сообщение 4.9.2014, 21:19
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 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
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 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);
}

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

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 16.4.2024, 18:05