LINUX.ORG.RU

Пара вопросов по C++

 


0

1

Вот код из книги про qt

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[]){
	QApplication app(argc, argv);
	QPushButton *button = new QPushButton("Quit");
	QObject::connect(button, SIGNAL(clicked()), &app, SLOT(quit()));
	button->show();
	return app.exec();
}

1) QApplication app(argc, argv); это создание объекта? Почему не QApplication app = new QApplication(argc, argv); ?

2) SIGNAL(), clicked(), SLOT(), quit() это функции? Почему если попробовать вызвать clicked() или quit() отдельно то будет ошибка 'was not declared in this scope' ?

★★★★★

Почему не QApplication app = new QApplication(argc, argv)

Потому что на стэке.

2) SIGNAL(), clicked(), SLOT(), quit()

Это кутешные примочки.

yoghurt ★★★★★ ()

Почему если попробовать вызвать clicked() или quit() отдельно то будет ошибка 'was not declared in this scope' ?

Слоты - как-бы методы класса. Замкнуты вокруг состояния объекта. Объект нужен, иными словами.

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

Потому что на стэке.

Где можно об этом почитать?

Слоты - как-бы методы класса. Замкнуты вокруг состояния объекта. Объект нужен, иными словами.

вот тут что происходит? SIGNAL(clicked()) похоже на вызов clicked() и передачу результата как параметра SIGNAL().

TDrive ★★★★★ ()

1) а зачем?

2) clicked() это сигнал, и если ты вызовешь его напрямую, то он отправится.

quit() - это слот. в данном случае он соединен с сигналом clicked() у кнопки. Когда сигнал отправляется, вызываются все слоты, с которыми он соединен. Если ни одного слота не соединено, то сигнал никем не будет принят.

SIGNAL() и SLOT() это специальные макросы, с помощью которых нужно указывать сигналы и слоты соответственно в функции QObject::connect()

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

Где можно об этом почитать?

В любой нормальной книжке по С++.

И _только после_ этого читай документацию по Qt на предмет signals/slots.

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

Какая именно глава? хотя бы примерно.

Тебе нужно почитать про стэк, кучу и т.п. Вместо Страуструпа лучше почитай Таненбаума «Modern Operating Systems». Ну или википедию, на худой конец.

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

Где можно об этом почитать?

Тебя интересует конструкция в крестах (читай в любом месте про конструкторы, не забудь добавить слово c++11 к поисковому запросу)?

Если нет, то начинай с Си (K&R), знать где проходит граница между крестами и сишкой нужно (для крестов).

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

SIGNAL(clicked()) похоже на вызов clicked() и передачу результата как параметра SIGNAL()

нет

# define SIGNAL(a)   "2"#a

поэтому SIGNAL(clicked()) - это строковый литерал «2clicked()», который распарсится в рантайме внутри Qt

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

Какая именно глава? хотя бы примерно.

Всего. При таком уровне непонимания языка тебе одна глава никак не поможет.

slovazap ★★★★★ ()

2) SIGNAL(), clicked(), SLOT(), quit() это функции?

Макросы-пустышки для moc и названия методов. С Qt5 можно писать так:

QObject::connect(button, &QPushButton::clicked, &app, &QApplication::quit);
anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.