crossplatform.ru

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


  Ответ в QTimer не срабатывает слот
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 10 сообщений [ в обратном порядке ]
BRE Дата 27.2.2012, 20:52
 
Цитата(Steklova Olga @ 27.2.2012, 19:36) *
Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ?

Ну если я правильно понимаю, что делает Application.ProcessMessages в делфи, то в Qt есть несколько штатных средств для обработки скопившихся сообщений в очереди:
QCoreApplication::processEvents(...)
и
QEventLoop::processEvents(...)

Алексей1153 Дата 27.2.2012, 19:47
  Steklova Olga, это не дельфийское, это виндоапишное ) В таких случаях городится костыль - локальная петля обработки сообщений. Но костыль - он и есть костыль , лучше через поток ИМХО. В Qt я не заморачивался поиском такого подпинывателя, а сейчас глянул - нашёл только для перерисовки, для остальных сообщений не нашёл

И - если сделать по-виндошному, то не будет кроссплатформенности
Steklova Olga Дата 27.2.2012, 18:36
  Алексей1153, а в Qt нет чего-нибудь типа дельфийского Application.ProcessMessages ?
Алексей1153 Дата 27.2.2012, 16:48
  Ov3r1oad, тебе нужно запустить процесс сжатия в отдельном потоке, тогда диалог не перестанет реагировать на сообщения от системы

Ov3r1oad Дата 27.2.2012, 16:08
  Steklova Olga, ilyabvt, В общем, есть вот большой класс, наследуемый от QDialog. В нём куча кнопок, виджетов и прочей требухи. Так же там есть функция, ну допустим, сжатия файлов. Она, эта функция, затратная по времени, и мне нужно, чтобы пользователь понимал, что вот идёт архивация, и приложение не зависло (как ему может показаться). Для этого я хочу, чтобы на ProgressBar шкала просто двигалась назад и вперед, пока идёт архивация. То он нажимает на кнопку "Архивация", в слоте для этой кнопки лежит вот эта функция архивации. Что мне нужно сделать, чтобы прогрессбар у меня обновлялся?
Steklova Olga Дата 27.2.2012, 12:44
  Ov3r1oad,
смотрите код
class object: public QDialog
{
    Q_OBJECT

    QTimer* timer;
    QPushButton* button_timer_start;
    QPushButton* button_timer_stop;
    
private slots:
    void slot_obj_update();
    void slot_timer_start();
    void slot_timer_stop();
};

object::object ()
{
    timer = new QTimer(this);
    button_timer_start = new QPushButton(this);
    button_timer_stop = new QPushButton(this);
    
    connect(timer, SIGNAL(timeout()), this, SLOT(slot_obj_update()));
    
    connect(button_timer_start, SIGNAL(clicked()),
            this, SLOT(slot_timer_start()));
    
    connect(button_timer_stop, SIGNAL(clicked()),
            this, SLOT(slot_timer_stop()));
}

void object::slot_timer_start()
{
    timer->start(100);
}

void object::slot_timer_stop()
{
    timer->stop();
}

void object::slot_obj_update()
{
    //при очередном шаге (срабатывании) таймера попадаете сюда,
    //выполняете здесь свои вычисления для этого очередного шага:
    //...

    //соответственно этому шагу меняете уровень ProgressBar:
    //...
}
если не хотите делать две кнопки, то смотрите код
class object: public QDialog
{
    Q_OBJECT

    QTimer* timer;
    QPushButton* button_timer_start;
    
private slots:
    void slot_obj_update();
    void slot_timer_start();
};

object::object ()
{
    timer = new QTimer(this);
    button_timer_start = new QPushButton(this);
    
    connect(timer, SIGNAL(timeout()), this, SLOT(slot_obj_update()));
    
    connect(button_timer_start, SIGNAL(clicked()),
            this, SLOT(slot_timer_start()));   
}

void object::slot_timer_start()
{
    timer->start(100);
}

void object::slot_obj_update()
{
    //при очередном шаге (срабатывании) таймера попадаете сюда,
    //выполняете здесь свои вычисления для этого очередного шага:
    //...

    //соответственно этому шагу меняете уровень ProgressBar:
    //...

    if (решили, что пора выключить таймер)
        timer->stop();
}
Не путайте QTimer и оператор цикла for !
Присоединяюсь к словам "Расскажи задачу" (конкретнее, про "затратный по времени код") (прежде чем думать о потоках) :)
P.S. А сообщения запрещено Вам пока редактировать как новичку.
ilyabvt Дата 27.2.2012, 12:42
  Ov3r1oad Конечно не заходит, ведь вы его остановили. Уберите функцию stop() из func() и поместите ее в update().
Цитата
Тут видимо надо вызывать поток отдельный для этого таймера.

Не надо!
Ov3r1oad Дата 27.2.2012, 11:26
  ilyabvt, Так в функции update() и меняется ProgressBar =), а в этот update, собственно и не заходит вообще программа. Тут видимо надо вызывать поток отдельный для этого таймера.
ilyabvt Дата 26.2.2012, 13:46
  Ov3r1oad Функция stop() останавливает ваш таймер. Если вы ее вызываете сразу после start() то ваш таймер даже одного раза не успевает отработать.
В функции func() нужно вызвать только start(). А stop() нужно вызвать только после того как ваш таймер выполнит то что ему полагается. В вашем случае это достижение ProgressBar уровня 100%. Значит вам следует либо в функции update() проверять уровень ProgressBar или извне вызвать функцию stop() когда уровень ProgressBar достигнет 100%.
Цитата
Получается, я должен вызвать start и stop в разных функциях?

Да
zloiia Дата 26.2.2012, 0:00
  А может пускай таймер постоянно квакает, но в слоте update() смотреть на какой-то внешний флаг активности, который поднимается в object::func() ?
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 11.7.2025, 14:09