LINUX.ORG.RU

Как получить доступ элементам формы в Qt Creator из другого класса?

 


1

1
//mainwindow.h

class MainWindow...

private:
    Ui::MainWindow *ui;


Доступ к ui из другого класса закрыт.

Если в конструкторе класса MainWindow добавить указатель на конкретный элемент

QLabel *my_label = new QLabel(this->ui->label);

То как к нему обращаться из другого класса?

И, почему, если после объявления указателя на конкретный элемент, установить значение параметра, например setText, то при запуске формы оно смешается с установленным в дизайнере формы значением.


Не делай так, это плохо. Все реализуй через геттеры/сеттеры.

panter_dsd ★★★★
()

QLabel *my_label = new QLabel(this->ui->label);

ты создаешь новый экземпляр, копируя свойства существующего. Чтобы сделать, то что ты хочешь, нужно в описании класса добавить

public:
QLabel * lbl;
а в конструкторе
lbl = ui->label;
Потом можно обращаться к лейблу mainWindow->lbl->setText(«sdf»);

Но так делать не надо.

Tweaker ★★★★☆
()

Делать это неправильно.

anonymous
()

Ты же создаешь копию лейбла, она появляется в том же месте, но с другим текстом - вот и смешивается. Это вопрос даже не столько по Qt, сколько по C++.

POLTER ★★
()
Ответ на: комментарий от Tweaker

Так правильно?

//mainwindow.h

public:
    QString get_text_from_label(QLabel label);
    bool set_text_to_label(QLabel label, QString string);

//mainwindow.cpp

QString get_text_from_label(QLabel label) {

    return label.text();

}

bool set_text_to_label(QLabel label, QString string) {

    label.setText(string);

    if (label.text() == string) {

        return true;

    }

    else {

        return false;

    }

}

puding
() автор топика
Ответ на: комментарий от puding

Нет, QLabel не нужен. Я бы сделал так:

//mainwindow.h
public:
    QString labelText();
    void setLabelText(QString string);

//mainwindow.cpp
QString MainWindow::labelText() {
    return ui->label->text();
}

void MainWindow::setLabelText(QString text) {
    ui->label->setText(text);
}

Tweaker ★★★★☆
()
Ответ на: комментарий от Tweaker

А, точно, а то я хотел устанавливать текст для любого label одной функцией, а для этого к нему нужно обращаться.

Спасибо!

puding
() автор топика
Ответ на: комментарий от Tweaker

QLabel *my_label = new QLabel(this->ui->label);

ты создаешь новый экземпляр, копируя свойства существующего. Чтобы сделать, то что ты хочешь, нужно в описании класса добавить

выдыхай, бобер.

1. copy ctor для виджетов в Qt закрыт 2. даже если бы он был бы открыт, это не вызов copy ctor, ибо ui->label - это указатель. это просто вызов конструктора с параметром, ui->label выступает в роли parent.

vvviperrr ★★★★★
()
Ответ на: комментарий от POLTER

Ты же создаешь копию лейбла, она появляется в том же месте, но с другим текстом - вот и смешивается. Это вопрос даже не столько по Qt, сколько по C++.

да где вы там копирование увидели то

vvviperrr ★★★★★
()
Ответ на: комментарий от vvviperrr

да, действительно, всего лишь parent. Перепутал.

POLTER ★★
()
Ответ на: комментарий от Tweaker
void setLabelText(QString string);

лучше

void setLabelText(const QString & string);

хотя разница, конечно, невелика в случае Qt

unC0Rr ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.