Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [QT4] QFrame установка backgroundColor


Автор: Mal Hack 7.8.2007, 22:16
Как на QFrame установить фоновый цвет?
Копать в такую сторону: 
Код

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

или есть по проще?

Автор: nickless 8.8.2007, 22:17
Если цвет не стандартный, то надо изменять нужный цвет в 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);

Автор: Mal Hack 10.8.2007, 16:17
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 требудет же указатель...

Автор: nickless 10.8.2007, 19:33
Цитата(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 и присвоить его чему-нибудь, удалять этот класс не надо, тут надо смотреть в документации.

Автор: Mal Hack 10.8.2007, 21:48
Для использования delete обязательно объявлять переменую как указатель, или можно, как объект?

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

Если честно, не совсем понял о чем ты. Ты имеешь ввиду, что Qt сам удаляет "потомков"?

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

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

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


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

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


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

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

Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)