Отвечая на мою вторую часть вопроса для других.
Я искал функции рисования в QTreeView и нашел следующее:
void QTreeView::drawBranches ( QPainter * painter, const QRect & rect, const QModelIndex & index )
С помощью этой функции вы можете рисовать все, что хотите в левой части каждого элемента.
И еще один хороший выбор для этого - используйте Таблицы стилей для QTreeView:
http://qt.nokia.com/doc /4.6/stylesheet-examples.html#customizing-qtreeview
Вообще говоря:
static const
Потому что он уважает объем и безопасен для типов.
Единственное предостережение, которое я мог видеть: если вы хотите, чтобы переменная была определена в командной строке. Есть еще альтернатива:
#ifdef VAR // Very bad name, not long enough, too general, etc..
static int const var = VAR;
#else
static int const var = 5; // default value
#endif
По возможности вместо макросов / многоточия используйте безопасную альтернативу типа.
Если вам действительно НУЖНО идти с макросом (например, вы хотите __FILE__
или __LINE__
), то вам лучше ОЧЕНЬ назвать свой макрос ОЧЕНЬ осторожно: в соглашении об именах Boost рекомендует все заглавные буквы, начиная с имени проекта (здесь BOOST_), при просмотре библиотеки вы заметите, что за ней (в общем случае) следует имя конкретной области (библиотеки), а затем со значимым имя.
Это обычно делает для длинных имен:)
В C #define
гораздо популярнее. Вы можете использовать эти значения для объявления размеров массивов, например:
#define MAXLEN 5
void foo(void) {
int bar[MAXLEN];
}
ANSI C не позволяет вам использовать static const
в этом контексте, насколько я знаю. В C ++ вы должны избегать макросов в этих случаях. Вы можете написать
const int maxlen = 5;
void foo() {
int bar[maxlen];
}
и даже пропустить static
, поскольку внутренняя связь уже подразумевается const
[только в C ++].
Если вы можете сойти с рук, static const
имеет много преимуществ. Он подчиняется принципам обычной области видимости, отображается в отладчике и в целом подчиняется правилам, которым подчиняются переменные.
Тем не менее, по крайней мере, в оригинальном стандарте C, на самом деле он не является константой. Если вы используете #define var 5
, вы можете написать int foo[var];
в качестве объявления, но вы не можете сделать это (кроме как в качестве расширения компилятора) с помощью static const int var = 5;
. Это не так в C ++, где версия static const
может использоваться везде, где может использоваться версия #define
, и я полагаю, что это также относится и к C99.
Однако никогда не называйте константу #define
строчными буквами. Она переопределит любое возможное использование этого имя до конца модуля перевода. Макросконстанты должны находиться в том, что фактически является их собственным пространством имен, которое традиционно состоит из заглавных букв, возможно, с префиксом.
Не думаю, что есть ответ на вопрос «что всегда лучше», но, как сказал Матье
static const
безопасен по типу. Однако больше всего меня беспокоит #define
, когда при отладке в Visual Studio вы не можете наблюдать за переменной. Выдает ошибку о том, что символ не может быть найден.
Разница между static const
и #define
заключается в том, что первый использует память, а второй не использует память для хранения. Во-вторых, вы не можете передать адрес #define
, тогда как вы можете передать адрес статической константы
. На самом деле это зависит от того, в каких обстоятельствах мы находимся, и нам нужно выбрать одно из этих двух. Оба лучше всего проявляют себя в разных обстоятельствах. Пожалуйста, не думайте, что один лучше другого ...: -)
Если бы это было так, Деннис Ричи оставил бы самого лучшего в одиночестве ... хахаха .. .: -)
Конкретно в C? В языке C правильный ответ: используйте #define
(или, если необходимо, enum
)
Хотя полезно иметь свойства области видимости и типизации константы const
объект, на самом деле объекты const
в C (в отличие от C ++) не являются настоящими константами и поэтому обычно бесполезны в большинстве практических случаев.
Итак, в C выбор должен определяться как вы планируете использовать свою константу. Например, вы не можете использовать объект const int
в качестве метки case
(хотя макрос будет работать). Вы не можете использовать объект const int
в качестве ширины битового поля (хотя макрос будет работать). В C89 / 90 вы не можете использовать объект const
для указания размера массива (в то время как макрос будет работать). Даже в C99 вы можете ' t используйте объект const
, чтобы указать размер массива, когда вам нужен массив, отличный от VLA .
Если это важно для вас, то он определит ваш выбор. В большинстве случаев у вас не будет другого выбора, кроме как использовать #define
в C. И не забывайте еще одну альтернативу, которая создает истинные константы в C - enum
.
] В C ++ объекты const
являются истинными константами, поэтому в C ++ почти всегда лучше отдавать предпочтение варианту const
(хотя явные static
в C ++ не нужны) .
Это зависит от того, для чего вам нужно значение. Вы (и все остальные) пропустили третью альтернативу:
static const int var = 5;
#define var 5
enum {var = 5};
Игнорирование проблем, связанных с выбором имени , затем:
Таким образом, в большинстве контекстов предпочтительнее «перечисление» перед альтернативами. В противном случае первый и последний пункты, вероятно, будут определяющими факторами - и вам придется больше подумать, если вам нужно удовлетворить оба сразу.
Если вы спрашивали о C ++, то вы ' d используйте параметр (1) - статическую константу - каждый раз.