Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [QT4] QFrame установка backgroundColor 
V
    Опции темы
Mal Hack
Дата 7.8.2007, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Как на QFrame установить фоновый цвет?
Копать в такую сторону: 
Код

    QPalette *pal = new QPalette(QBrush(Qt::Background, Qt::white));
    
    fsColorFrame->setBackgroundRole(pal);
    pal->~QPalette();

или есть по проще?
PM ICQ   Вверх
nickless
Дата 8.8.2007, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Если цвет не стандартный, то надо изменять нужный цвет в palette.

Только устанавливается она методом setPalette(QPalette&), a setBackgroundRole принимает QPalette::ColorRole, это например если нужно сделать окна стандартным цветом текста итд.
setPalette скопирует себе палетту, так что динамически выделять память тут вообще ненадо.
И в любом случае не нужно вызывать деструктор напрямую, для этого есть delete.

Вот например как это (ну немного больше чем только цвет) делает Qt Designer:
Код
    centralwidget = new QWidget(MainWindow);
    centralwidget->setObjectName(QString::fromUtf8("centralwidget"));
    QPalette palette;
    QBrush brush(QColor(255, 255, 255, 255));
    brush.setStyle(Qt::SolidPattern);
    palette.setBrush(QPalette::Active, QPalette::Base, brush);
    QBrush brush1(QColor(0, 128, 0, 255));
    brush1.setStyle(Qt::SolidPattern);
    palette.setBrush(QPalette::Active, QPalette::Window, brush1);
    palette.setBrush(QPalette::Inactive, QPalette::Base, brush);
    palette.setBrush(QPalette::Inactive, QPalette::Window, brush1);
    palette.setBrush(QPalette::Disabled, QPalette::Base, brush1);
    palette.setBrush(QPalette::Disabled, QPalette::Window, brush1);
    centralwidget->setPalette(palette);
    centralwidget->setAutoFillBackground(true);



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Mal Hack
Дата 10.8.2007, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



nickless, очередное спасибо. Но смотри, я сделал так:
Код
    QPalette palette;
    QBrush brush(QColor(fsColorRSpin->value(), fsColorGSpin->value(), fsColorBSpin->value(), 255));
    brush.setStyle(Qt::SolidPattern);
    palette.setBrush(QPalette::Active, QPalette::Window, brush);

т.е. в принципе, остальные строчки, что ты указал не нужны? Или я не прав?



Цитата(nickless @  8.8.2007,  22:17 Найти цитируемый пост)
И в любом случае не нужно вызывать деструктор напрямую, для этого есть delete.

А destroy() тогда зачем? Чем плохо напряую? delete требудет же указатель...
PM ICQ   Вверх
nickless
Дата 10.8.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Цитата(Mal Hack @  10.8.2007,  15:17 Найти цитируемый пост)
т.е. в принципе, остальные строчки, что ты указал не нужны?

Если работает как надо, значит не нужны, тот код сгенерирован Qt Designer-ом, он там кроме цвета еще чего-то делает.

Цитата(Mal Hack @  10.8.2007,  15:17 Найти цитируемый пост)
Чем плохо напряую?

delete автоматически вызывает деструктор, а потом освобождает память выделенную для самого класса, если вызвать деструктор напрямую, он освободит память возможно выделенную в конструкторе итд. НО память выделенную под сам класс он не освободит.

Вот пример:
Код
class A
{
public:
    A() { p = new int[20]; };
    ~A() { delete [] p; }
private:
    int* p;
};

int main()
{
    A* a = new A;

//    a->~A();
    delete a;

    return 0;
}


С delete всё освобождается:
Код
$ valgrind --leak-check=full ./main
==9057== Memcheck, a memory error detector.
==9057== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==9057== Using LibVEX rev 1732, a library for dynamic binary translation.
==9057== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==9057== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==9057== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==9057== For more details, rerun with: -v
==9057==
==9057==
==9057== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 7 from 1)
==9057== malloc/free: in use at exit: 0 bytes in 0 blocks.
==9057== malloc/free: 2 allocs, 2 frees, 84 bytes allocated.
==9057== For counts of detected errors, rerun with: -v
==9057== All heap blocks were freed -- no leaks are possible.


А только с вызовом деструктора утекают 4 байта, т.е. sizeof(A):
Код
==9150== Memcheck, a memory error detector.
==9150== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==9150== Using LibVEX rev 1732, a library for dynamic binary translation.
==9150== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==9150== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==9150== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==9150== For more details, rerun with: -v
==9150==
==9150==
==9150== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 7 from 1)
==9150== malloc/free: in use at exit: 4 bytes in 1 blocks.
==9150== malloc/free: 2 allocs, 1 frees, 84 bytes allocated.
==9150== For counts of detected errors, rerun with: -v
==9150== searching for pointers to 1 not-freed blocks.
==9150== checked 107,904 bytes.
==9150==
==9150== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==9150==    at 0x4021F24: operator new(unsigned) (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==9150==    by 0x8048591: main (main.cpp:13)
==9150==
==9150== LEAK SUMMARY:
==9150==    definitely lost: 4 bytes in 1 blocks.
==9150==      possibly lost: 0 bytes in 0 blocks.
==9150==    still reachable: 0 bytes in 0 blocks.
==9150==         suppressed: 0 bytes in 0 blocks.


Кстати объекты Qt обычно сами удаляют друг друга, например если создать QBoxLayout и присвоить его чему-нибудь, удалять этот класс не надо, тут надо смотреть в документации.

Это сообщение отредактировал(а) nickless - 10.8.2007, 22:41


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Mal Hack
Дата 10.8.2007, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Для использования delete обязательно объявлять переменую как указатель, или можно, как объект?

Цитата(nickless @  10.8.2007,  19:33 Найти цитируемый пост)
Кстати объекты Qt обычно сами удаляют друг друга, например если создать QBoxLayout и присвоить его чему-нибудь, удалять этот класс не надо, иначе будет коредамп, тут надо смотреть в документации. 

Если честно, не совсем понял о чем ты. Ты имеешь ввиду, что Qt сам удаляет "потомков"?
PM ICQ   Вверх
nickless
Дата 10.8.2007, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 13
Всего: 181



Всё что было создано new надо удалять с помощью delete, а если переменная - объект, её делитом удалять не надо (да и не получится), она сама уничтожится когда закончится скоп (scope т.е. функция, блок итд).

Цитата(Mal Hack @  10.8.2007,  20:48 Найти цитируемый пост)
Ты имеешь ввиду, что Qt сам удаляет "потомков"?

Не потомков а скорей детей, т.е. допустим есть QFrame, а на ней куча всяких контролов. При создании любого контрола, ему передаётся указатель на родителя "parent", этот родитель убивает всех детей при удалении.
Некоторые функции перенимают владение объектами, которых ей передают, а некоторые нет, это надо смотреть в документации.



Это сообщение отредактировал(а) nickless - 10.8.2007, 22:42


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Mal Hack
Дата 10.8.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 1
Всего: 261



Цитата(nickless @  10.8.2007,  22:41 Найти цитируемый пост)
Всё что было создано new надо удалять с помощью delete, а если переменная - объект, её делитом удалять не надо (да и не получится), она сама уничтожится когда закончится скоп (scope т.е. функция, блок итд).

Ясно, значит в моем случае delete не нужен, т.к. указателей я не использую.


Цитата(nickless @  10.8.2007,  22:41 Найти цитируемый пост)
Не потомков а скорей детей, т.е. допустим есть QFrame, а на ней куча всяких контролов. При создании любого контрола, ему передаётся указатель на родителя "parent", этот родитель убивает всех детей при удалении.
Некоторые функции перенимают владение объектами, которых ей передают, а некоторые нет, это надо смотреть в документации.

Ну я это и имел ввиду, выразился только, конечно, не корректно.

Спасибо.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.1061 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.