Виджеты и указатели Qt - PullRequest
       4

Виджеты и указатели Qt

0 голосов
/ 02 апреля 2011

При работе с Qt виджетами (т.е. QLabel), почему мы используем указатели?

Например, почему мы пишем:

QLabel *label = new QLabel("Hello");

И, не :

QLabel label = new QLabel("Hello");?

Спасибо.

Ответы [ 5 ]

6 голосов
/ 02 апреля 2011

new возвращает указатель. Если вы создаете объект с помощью динамического выделения памяти - вам, очевидно, придется использовать указатель.

QLabel label = new QLabel("Hello"); неверный код и не будет компилироваться.

Почему вы используете динамическое распределение для виджетов? Потому что они должны быть живы между вызовами функций, как в любой управляемой событиями графической системе. Выделения в стеке (локальные объекты) будут освобождены в конце области, что не очень хорошо работает с виджетами.

4 голосов
/ 02 апреля 2011

Потому что, если вы создадите их в стеке, они будут удалены после окончания области действия.

Если вы напишите что-то вроде этого:

void foo()
{
QWidget windget;
}

виджет будет удален после foo() прекращается.При использовании new он будет действовать до тех пор, пока не будет удален вручную (обычно родительским виджетом).

Я не думаю, что QLabel label = new QLabel("Hello"); даже скомпилируется.Возможно, вы QLabel label("Hello");

3 голосов
/ 02 апреля 2011

Я думаю, что это не проблема Qt, это должен быть вопрос программирования на C ++.Возможно, вы использовали Java раньше, так как в Java нет концепции указателя.Мое предложение, найдите книгу по C ++ и изучите основную концепцию и использование о том, что означает указатель C ++, прежде чем пытаться использовать C ++ и Qt.

0 голосов
/ 04 апреля 2011

Просто чтобы завершить, нет причины, по которой вы не должны размещать некоторые виджеты в стеке. Это особенно удобно для объектов с ограниченным сроком службы, таких как контекстное меню и модальные диалоговые окна, где вам нужно дождаться результата. В этих виджетах вы обычно вызываете exec (), который блокирует, пока пользователь не закроет его.

0 голосов
/ 02 апреля 2011

Если вы хотите определить переменную без указателя, она выглядит как QLabel label;Метка, которую мы получили:

  • находится в стеке.
  • не поддерживает полиморфизм.

В c ++ переменная будет объектно-ориентированной, только если вы используете ее через указатель или ссылку.Qt является объектно-ориентированной библиотекой классов, поэтому QLabel определяется с помощью указателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...