ситуация такая
есть основной класс MainWindow
он содержит все виджеты и рисует главное окно
в одном из слотов он создает внешний класс Outer, и передает в его метод ссылку на свой QLabel
этот внешний класс меняет текст QLabel-а:
label->setText('custom text');
Проблема заключается в том, что текст меняется лишь тогда, когда метод класса Outer заканчивает свою работу.
Скажите пожалуйста, есть ли возможность обновить QLabel несколько раз по ходу работы метода Outer-класса?
пробовал
label->update();
не помогло
получилось с repaint();
это правильный способ?
Не очень красивое решение с точки зрения архитектуры.
IMHO лучше пусть объект класса Outer посылает сигнал о том, что его состояние изменилось, а уже в слоте, который может располагаться в класса MainWindow, менять значение QLabel.
Насчет обновления QLabel в процессе работы метода, нужно крутить цикл обработки событий.
Например, в цикле этого метода вызывать:
qApp->processEvents();
BRE
спасибо, за совет, но я понял только первый абзац
т.е. надо в MainWindow сделать метод
void updateLabel(QString newtext)
{
label->setText(newtext);
label->repaint();
}
а в Outer его вызывать
windowClass->updateLabel("wait..")
Правда в этом случае придется передавать ссылку на класс MainWindow в метод Outer
тогда не понимаю чем это лучше
и ещё не понял какой цикл надо крутить
я давно занимаюсь вебом, пишу на php
а подходы в системном программировании мне неизвестны, поясните их пожалуйста хотя бы минимальными примерами
class Outer : public QObject
{
Q_OBJECT
void func()
{
for(;;)
{
// Что-то делаем
emit stateChaged( ... )
qApp->processEvent();
}
}
signals:
void stateChanged( const QString & );
];
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow() : QMainWindow()
{
outer = new Outer;
connect( outer, SIGNAL( stateChaged( const QString & ) ), SLOT( updateLabel( const QString & ) ) );
}
public slots:
void updateLabel( const QString &str )
{
label->setText( str );
}
};
сделал все по этому примеру, но постоянно натыкаюсь на ошибку
debug/mainwindow.o:mainwindow.cpp:(.text$_ZN7CaptchaC1Ev[Captcha::Captcha:-1: error: undefined reference to `vtable for Outer'
ещё вопрос: сигнал надо объявлять только в описании класса?
signals:
void mySignal(QString text);
или надо создать его тело и чтобы он что-то возвращал?
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)