Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2016, 02:55   #141
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Немного переделал(смотреть скрин), додал кнопку кансел в прогрес виджет, выход при нажатии хрестика. Но когда я жму на старт второй раз оно сразу показывает что нашло 4 файла(смотреть другой скрин, там в рамке 3 файла , они появляются при 0% прогреса), тоесть не очищает полностю то ранше нашло. я ж делаю клеар
Код:
 mFoundFilesList->clear();
Код функции нажатия на кнопку старт
Код:
void FindFilesWidget::startClicked()
{
    mFoundFilesList->clear();
    const int idealThreadCount = QThread::idealThreadCount();
    for (size_t index = 0; index < mThreads.size(); ++index)
        delete mThreads[index];
    mThreads.clear();
    mThreads.reserve(idealThreadCount);

    mPaths.clear();
    QDirIterator dirIt(mSearchDirectoryLine->text(), QDirIterator::Subdirectories);
    qint64 directorySizeInBytes = 0;
    while (dirIt.hasNext())
    {
        dirIt.next();
        QFileInfo fileInfo(dirIt.filePath());
        if (fileInfo.isFile())
        {
            if (fileInfo.suffix() == "txt")
            {
                mPaths.push_back(dirIt.filePath());
                directorySizeInBytes += fileInfo.size();
            }
        }
    }

    const std::vector<Range> ranges = GenerateRanges(idealThreadCount, mPaths.size());
    for (size_t index = 0; index < idealThreadCount; ++index)
        mThreads.push_back(new FindWordInFilesThread(mPaths, mSearchWordLine->text(), ranges[index].mStart, ranges[index].mLength));

    //if (mProgressWidget == nullptr)
       mProgressWidget = new ProgressWidget(directorySizeInBytes);

    QObject::connect(mProgressWidget, SIGNAL(finished()), this, SLOT(finished()));
    QObject::connect(mProgressWidget, SIGNAL(paused()), this, SLOT(pausedClicked()));
    QObject::connect(mProgressWidget, SIGNAL(continued()), this, SLOT(continuedClicked()));
    QObject::connect(mProgressWidget, SIGNAL(canceled()), this, SLOT(cancelClicked()));

    mProgressWidget->show();

    for (size_t index = 0; index < idealThreadCount; ++index)
    {
        QObject::connect(mThreads[index], SIGNAL(progressChanged(qint64)), mProgressWidget, SLOT(progressChanged(qint64)));
        QObject::connect(mThreads[index], SIGNAL(fileFound(const QString&)), this, SLOT(fileFound(const QString&)));
    }

    for (size_t index = 0; index < idealThreadCount; ++index)
        mThreads[index]->start();

}
Код:
QGroupBox* FindFilesWidget::createFoundFilesGroup()
{
    QGroupBox* foundFilesGroup = new QGroupBox("&Found files:");
    mFoundFilesList = new QListWidget(foundFilesGroup);

    QHBoxLayout* hLayout = new QHBoxLayout();
    hLayout->setSpacing(6);
    hLayout->setContentsMargins(11, 11, 11, 11);
    hLayout->addWidget(mFoundFilesList);

    foundFilesGroup->setLayout(hLayout);
    return foundFilesGroup;
}
И спп прогрес виджета:
Код:
#include "ProgressWidget.h"
#include <cassert>

ProgressWidget::ProgressWidget(qint64 directorySizeInBytes, QDialog *parent)
    : QDialog(parent)
    , mActionState(RUNNING)
    , mDirectorySizeInBytes(directorySizeInBytes)
    , mBytesProcessed(0)
{
    setWindowTitle("Progress");
    setModal(true);

    mProgressBar = new QProgressBar();
    mProgressBar->setMaximum(100);
    mProgressBar->setMinimumWidth(200);
    mProgressBar->setAlignment(Qt::AlignCenter);
    mProgressBar->setValue(0);

    mPauseOrContinueButton = new QPushButton("&Pause");
    mCancelButton = new QPushButton("&Cancel");


    QHBoxLayout* hLayout = new QHBoxLayout();
    hLayout->addWidget(mPauseOrContinueButton);
    hLayout->addWidget(mCancelButton);
    hLayout->setSpacing(6);
    hLayout->setContentsMargins(11, 11, 11, 11);

    QVBoxLayout* vLayout = new QVBoxLayout();
    vLayout->addWidget(mProgressBar);
    vLayout->addLayout(hLayout);

    connect(mPauseOrContinueButton, SIGNAL(clicked()), SLOT(pauseClicked()));
    connect(mCancelButton, SIGNAL(clicked()), SLOT(cancelClicked()));

    setLayout(vLayout);
    resize(300, 100);
}

ProgressWidget::~ProgressWidget()
{
    delete mPauseOrContinueButton;
    delete mCancelButton;
}

void ProgressWidget::pauseClicked()
{
    if ((mActionState == STOPPED) || (mActionState == PAUSED))
    {
        mActionState = RUNNING;
        mPauseOrContinueButton->setText("&Pause");
        emit continued();
    }
    else if (mActionState == RUNNING)
    {
        mActionState = PAUSED;
        mPauseOrContinueButton->setText("&Continue");
        emit paused();
    }
    else
    {
        assert(false);
    }
}

void ProgressWidget::cancelClicked()
{
    emit canceled();
    close();
}

void ProgressWidget::progressChanged(qint64 bytesProcessed)
{
    mBytesProcessed += bytesProcessed;
    int progressValue = 100 * ((float)mBytesProcessed / (float)mDirectorySizeInBytes);
    mProgressBar->setValue(progressValue);
    if (mBytesProcessed == mDirectorySizeInBytes)
    {
        emit canceled();
        close();
    }
}

void ProgressWidget::closeEvent(QCloseEvent* event)
{
    if (mBytesProcessed != mDirectorySizeInBytes)
    {
        emit paused();
        QMessageBox::StandardButton message = QMessageBox::question(this, "Progress", tr("Are you sure you want to exit?"), QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes, QMessageBox::Yes);
        if (message == QMessageBox::Yes)
        {
            emit canceled();
            event->accept();
        }
        else
        {
            emit continued();
            event->ignore();
        }
        emit finished();

    }
    else
    {
        emit canceled();
        close();
    }
}
Изображения
Тип файла: png Untitled.png (12.8 Кб, 59 просмотров)
Тип файла: png вывывывы.png (15.4 Кб, 58 просмотров)
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 10:35   #142
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так а что в слоте fileFound?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 10:56   #143
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так а что в слоте fileFound?
Код:
void FindFilesWidget::fileFound(const QString& fileName)
{
    mFoundFilesList->addItem(fileName);
}
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 11:03   #144
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Тогда странно, да.
Ну поставьте breakpoint'ы куда-нибудь и посмотрите что-нибудь, программирование это ж не только кодинг, но и отладка
http://doc.qt.io/qtcreator/creator-debug-mode.html
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 11:11   #145
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Тогда странно, да.
Ну поставьте breakpoint'ы куда-нибудь и посмотрите что-нибудь, программирование это ж не только кодинг, но и отладка
http://doc.qt.io/qtcreator/creator-debug-mode.html
и еще вопрос, я делаю в функции старт :
Код:
void FindFilesWidget::startClicked()
{
  .......
    mProgressWidget = nullptr;
........
 if (mProgressWidget == nullptr)
       mProgressWidget = new ProgressWidget(directorySizeInBytes);
..........
чтобы не создавать каждый раз новый екземпляр mProgressWidget , но я вижу что я создаю это каждый раз, как избежать этого(тоесть иф всегда срабатывает)?
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 11:16   #146
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А почему он должен не срабатывать если вы присвоили nullptr и проверяете, что он nullptr?оО

Если нужен только 1 экземпляр без пересоздания во время работы программы, то почему просто не создать его в конструкторе основного окна? (а лучше http://www.programmersforum.ru/showt...14#post1641051)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 11:23   #147
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А почему он должен не срабатывать если вы присвоили nullptr и проверяете, что он nullptr?оО

Если нужен только 1 экземпляр без пересоздания во время работы программы, то почему просто не создать его в конструкторе основного окна? (а лучше http://www.programmersforum.ru/showt...14#post1641051)
а нет, я имел введу что он всегда будет срабатывать. А мне нужно чтобы только первый раз, а потом в старт просто обнулять прогрес. Но как обнулить прогрес по другому я хз
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 11:25   #148
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

добавить в него public функцию/слот обнуления прогресс и вызывать ее.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.11.2016, 11:26   #149
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение

Если нужен только 1 экземпляр без пересоздания во время работы программы, то почему просто не создать его в конструкторе основного окна? (а лучше http://www.programmersforum.ru/showt...14#post1641051)
я об этом думал, но у меня аргумент directorySizeInBytes щитается встарте.
Код:
 mProgressWidget = new ProgressWidget(directorySizeInBytes);
stasJun вне форума Ответить с цитированием
Старый 03.11.2016, 11:46   #150
stasJun
Пользователь
 
Регистрация: 17.10.2016
Сообщений: 95
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
добавить в него public функцию/слот обнуления прогресс и вызывать ее.
ProgressWidget:
Код:
signals:
   void restart();

public slots:
    void restartClicked();
Код:
void ProgressWidget::restartClicked()
{
    mProgressBar->setValue(0);
}
FindWidget:
Код:
public slots:
    void restartClicked();

void FindFilesWidget::startClicked()
{
   .......
    restartClicked();
    .........
    QObject::connect(mProgressWidget, SIGNAL(restart()), this, SLOT(restartClicked()));
.........
}
void FindFilesWidget::restartClicked()
{
    mProgressWidget->restart();
}
Что я не так делаю? слоты создаю, сигнали тоже
stasJun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слов в файле Stepan_P Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 25.12.2015 14:14
Поиск слов в текстовом файле slipkos Помощь студентам 4 02.06.2013 19:18
Поиск симметричных слов в файле Almost Паскаль, Turbo Pascal, PascalABC.NET 1 10.01.2013 08:53
Поиск слов в файле сушка Общие вопросы по программированию, компьютерный форум 1 08.04.2012 12:44
Поиск слов в текстовом файле svt Помощь студентам 8 07.11.2009 19:56