crossplatform.ru

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


  Ответ в Правильно написать функцию в GUI проге
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Litkevich Yuriy Дата 6.9.2014, 10:07
 
Цитата(FireBlack @ 5.9.2014, 18:30) *
Например, QPushButton кнопку, при нажатии на которую выбирается файл - именовать pbnSelectFileName. Тогда слот будет выглядеть void MainWindow::on_pbnSelectFileName_clicked(), по-моему вполне читабельно.
да, тоже вариант
FireBlack Дата 5.9.2014, 17:27
 
Цитата(Aleksei @ 5.9.2014, 17:05) *
если с текстовым файлом постоянно работает система и ей нельзя мешать (допустим лог файл) в этом текст. файле нужно искать запись (допустим Error 100) файл довольно большой. Как лучше реализовать?

Просто периодически по таймеру или по сигналу от QFileSystemWatcher открываете этот файл для чтения, читаете его кусками и ищете искомую запись. Если, как Вы говорите, это большой лог файл (который только дополняется), то имеет смысл запоминать последнюю позицию и при следующем чтении файла начинать с нее.
Aleksei Дата 5.9.2014, 16:05
  спасибо учту.
Такой вопрос: если с текстовым файлом постоянно работает система и ей нельзя мешать (допустим лог файл) в этом текст. файле нужно искать запись (допустим Error 100) файл довольно большой. Как лучше реализовать? Прямиком по файлу запустить поиск или через буфер или копию файла сделать, запустить поиск и потом его удалить? что меньше нагрузит систему и не помещает системе писать в этот файл?
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 быть не может.
Привыкайте сразу писать код для людей, а не для компилятора.

А вот с этим я полностью согласен, красиво сказано.
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, вам книжку путнюю по Си++ надо держать под рукой
На начальном этапе может Герберт Шилдт подойти (но если будете вникать вам её покажется мало), а отечественных авторов лучше не брать, они сами нифига не понимают.
FireBlack Дата 5.9.2014, 4:56
 
Цитата(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);
}

Однако такой подход не является правильным т.к. файл у Вас открыт слишком долго. Обычно файлы закрываются сразу после использования (например, чтения или записи), чтобы другие приложения тоже имели к ним доступ.
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) тоже не работает. Запускается без ошибки но результат всегда закрыт файл.
marsel Дата 4.9.2014, 7:50
  Слушай ты бы хоть, какой нибудь учебник по С++ почитал.

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

private:
QString fileName

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

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

Читать и учить.
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());
}


как правильно оформить функцию?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 23:07