crossplatform.ru

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


  Ответ в как обновить QLabel?
Введите ваше имя
Подтвердите код

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

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


Последние 10 сообщений [ в обратном порядке ]
BRE Дата 23.1.2010, 19:38
 
Цитата(deex @ 23.1.2010, 15:19) *
сделал все по этому примеру, но постоянно натыкаюсь на ошибку

После добавления в проект класса-наследника от QObject нужно выполнять qmake. Он настроит правила для генерации moc-файлов.

Цитата(deex @ 23.1.2010, 15:19) *
ещё вопрос: сигнал надо объявлять только в описании класса?

или надо создать его тело и чтобы он что-то возвращал?

Да, только в описание класса. Тело его генерирует все тот-же moc. :)
deex Дата 23.1.2010, 15:19
  сделал все по этому примеру, но постоянно натыкаюсь на ошибку

debug/mainwindow.o:mainwindow.cpp:(.text$_ZN7CaptchaC1Ev[Captcha::Captcha:-1: error: undefined reference to `vtable for Outer'


ещё вопрос: сигнал надо объявлять только в описании класса?

signals:
void mySignal(QString text);

или надо создать его тело и чтобы он что-то возвращал?
BRE Дата 22.1.2010, 9:09
 
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 );
    }
};

deex Дата 22.1.2010, 8:17
  BRE
спасибо, за совет, но я понял только первый абзац

т.е. надо в MainWindow сделать метод

void updateLabel(QString newtext)
{
label->setText(newtext);
label->repaint();
}


а в Outer его вызывать

windowClass->updateLabel("wait..")

Правда в этом случае придется передавать ссылку на класс MainWindow в метод Outer
тогда не понимаю чем это лучше

и ещё не понял какой цикл надо крутить

я давно занимаюсь вебом, пишу на php
а подходы в системном программировании мне неизвестны, поясните их пожалуйста хотя бы минимальными примерами
BRE Дата 21.1.2010, 23:45
  Не очень красивое решение с точки зрения архитектуры.
IMHO лучше пусть объект класса Outer посылает сигнал о том, что его состояние изменилось, а уже в слоте, который может располагаться в класса MainWindow, менять значение QLabel.

Насчет обновления QLabel в процессе работы метода, нужно крутить цикл обработки событий.
Например, в цикле этого метода вызывать:
qApp->processEvents();

deex Дата 21.1.2010, 23:42
  ситуация такая
есть основной класс MainWindow
он содержит все виджеты и рисует главное окно

в одном из слотов он создает внешний класс Outer, и передает в его метод ссылку на свой QLabel

этот внешний класс меняет текст QLabel-а:

label->setText('custom text');

Проблема заключается в том, что текст меняется лишь тогда, когда метод класса Outer заканчивает свою работу.

Скажите пожалуйста, есть ли возможность обновить QLabel несколько раз по ходу работы метода Outer-класса?

пробовал
label->update();

не помогло

получилось с repaint();
это правильный способ?
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 11:43