Russian Qt Forum

Qt => Вопросы новичков => Тема начата: timovadia от Ноября 15, 2020, 12:30



Название: Как в файле cpp получить доступ к элементу фор
Отправлено: timovadia от Ноября 15, 2020, 12:30
Прошу помочь разобраться. Создал виджет проект. В файле widget.ui добавил кнопку pushButton (QPushButton) и поле textEdit (QTextEdit).

Мне нужно в поле textEdit добавить текст. Как это сделать? Как получить доступ к созданным на ui элементам формы и их методам?

Понимаю, что должно быть что-то вроде этого:
Код
C++ (Qt)
QTextEdit edit;
edit.setReadOnly(true);
edit.insertPlainText("text");

В файле widget.cpp следующий код:

Код
C++ (Qt)
#include "widget.h"
#include "ui_widget.h"
 
#include <QApplication>
#include <QAxObject>
#include <QAxWidget>
#include <QtWidgets>
#include <QString>
 
Widget::Widget(QWidget *parent)
   : QWidget(parent)
   , ui(new Ui::Widget)
{
   ui->setupUi(this);
}
 
Widget::~Widget()
{
   delete ui;
}
 
 
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   Widget mainWindow;
   mainWindow.setWindowTitle("qwerty");
 
   QVBoxLayout layout(&mainWindow);
 
   mainWindow.show();
   return a.exec();
}
 
void Widget::on_pushButton_clicked()
{
   this->close();
}


Название: Re: Как в файле cpp получить доступ к элементу формы (виджета)?
Отправлено: kambala от Ноября 15, 2020, 12:37
из методов класса Widget все элементы из дизайнера доступны через ui->элемент, например ui->textEdit.

просто надо читать документацию :)


Название: Re: Как в файле cpp получить доступ к элементу формы (виджета)?
Отправлено: tux от Ноября 15, 2020, 12:41
ui->textEdit->setText("текст");
Например


Название: Re: Как в файле cpp получить доступ к элементу фо&#
Отправлено: timovadia от Ноября 15, 2020, 12:44
В widget.cpp в main() пишу:
Код
ui->

Но ничего нет. Обычно помощник высвечивает список доступных вещей.

Код:
ui->textEdit->setText("текст");

Пишет, что ui -- undeclared identifier. Что я делаю не так? Где его нужно объявлять?


Название: Re: Как в файле cpp получить доступ к элементу фо&#
Отправлено: tux от Ноября 15, 2020, 13:03
Пишет, что ui -- undeclared identifier. Что я делаю не так? Где его нужно объявлять?
А вы откуда доступ то пытаетесь получить? В вашем случае это надо делать из самого вашего класса Widget. И в этом классе нет метода main :)
Вообще, лучше почитать сначала документацию. Или посмотреть "видосы" на youtube


Название: Re: Как в файле cpp получить доступ к элементу фо&#
Отправлено: timovadia от Ноября 15, 2020, 13:07
А вы откуда доступ то пытаетесь получить? В вашем случае это надо делать из самого вашего класса Widget. И в этом классе нет метода main :)
Хотел бы получить доступ из main(). Почему я в main не могу обращаться к элементам формы, не пойму? Буду читать и смотреть уроки.


Название: Re: Как в файле cpp получить доступ к элементу фо&#
Отправлено: tux от Ноября 15, 2020, 13:23
Почему я в main не могу обращаться к элементам формы, не пойму?
Потому, что ui формы находится в приватной зоне. Хотите доступ из main - сделайте сеттер. Т.е. публичный метод в форме Widget, который и будет устанавливать значения в ui.


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: timovadia от Ноября 15, 2020, 13:30
Спасибо! Туман понемногу рассеивается :)


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: kambala от Ноября 15, 2020, 13:39
а что мешает сделать все то же самое в конструкторе Widget? будет меньше возни.


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: tux от Ноября 15, 2020, 13:40
а что мешает сделать все то же самое в конструкторе Widget? будет меньше возни.
Вряд ли ТС хотел константный текст. Иначе, проще вообще в редакторе форм нужное написать. :)


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: timovadia от Ноября 15, 2020, 13:49
а что мешает сделать все то же самое в конструкторе Widget? будет меньше возни.
Плохо понимаю, о чем речь. Имеется ввиду что-то вроде этого?

Код
C++ (Qt)
#include <QWidget>
 
class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = 0);
};


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: tux от Ноября 15, 2020, 13:59
Код:
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui->textEdit->setText("текст");
}
Но так текст будет снаружи не изменяемым. Сеттер сделать лучше.


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: kambala от Ноября 15, 2020, 14:15
Плохо понимаю, о чем речь.
значит, стоит уделить побольше времени изучению самого языка С++, а в «окошки» лезть уже после ;)

предлагается перенести код из main(), связанный непосредственно с внутренностями Widget, в метод, где написано ui->setupUi(this) (после этой строки).

вообще, довольно часто main() выглядит крайне однообразно и не содержит никакой логики (особенно связанной с окошками):
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   Widget mainWindow;
   mainWindow.show();
 
   return a.exec();
}
 


Название: Re: Как в файле cpp получить доступ к элементу фо&#
Отправлено: timovadia от Ноября 15, 2020, 14:16
Странно. Вот пытаюсь написать , что предложили, но textEdit не видно.

(https://i.ibb.co/ng6rhCb/widget.png) (https://ibb.co/1v7ZH6L)



Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: kambala от Ноября 15, 2020, 14:20
значит, открывай дизайнер (свой файл ui), выделяй текстовое поле на своей форме и смотри какой у него идентификатор


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: timovadia от Ноября 15, 2020, 14:32
значит, открывай дизайнер (свой файл ui), выделяй текстовое поле на своей форме и смотри какой у него идентификатор
Идентификатор так и называется textEdit. Появился после запуска Ctrl+R. Спасибо.


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: tux от Ноября 15, 2020, 14:39
Идентификатор так и называется textEdit.
Лучше присваивать осмысленные имена. В будущем. :)


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: Авварон от Ноября 15, 2020, 16:08
значит, открывай дизайнер (свой файл ui), выделяй текстовое поле на своей форме и смотри какой у него идентификатор
Идентификатор так и называется textEdit. Появился после запуска Ctrl+R. Спасибо.

После изменения формы надо собрать проект, иначе Креатор видит старую версию сгенеренного хедера. Впрочем, они могли бы это и пофиксить.


Название: Re: Как в файле cpp получить доступ к элементу фор
Отправлено: kambala от Ноября 15, 2020, 16:17
вроде давно пофиксили, даже файл формы сохранять не надо по-моему...