Russian Qt Forum

Qt => Общие вопросы => Тема начата: troorl от Июнь 18, 2007, 18:08



Название: Непонятный сегфолт
Отправлено: troorl от Июнь 18, 2007, 18:08
Есть самописный виджет, который нужен для выбора цвета. Это простая кнопка, при нажатии на которую появляется диалог QColorDialog. Она меняет свой цвет в зависимости от того, что вернул диалог. Но также мне нужно иметь возможность вручную устанавливать цвет. Вот такой код
Код:
void TColorChoser::setColor(QColor color)
{
QPalette palette;
palette.setColor(QPalette::Button, color);
colorSelect->setPalette(palette); // colorSelect - это QPushButton
}

В самом начале программы, когда устанавливаются начальные значения, он работает, кнопка красится в нужный цвет. Но потом, вызов этого метода с тем же или любым другим значением даёт сегфолт.
Я уже не знаю, что делать и куда смотреть. Подскажите, что это за фигня??


Название: Непонятный сегфолт
Отправлено: Admin от Июнь 18, 2007, 19:29
мне кажется что дело в том
что pallete ваша локальная функция и гибнет вместе с концом функции

вот вызов - тут идет ссылка на обьект, а обьекта то уже и нет)
void setPalette ( const QPalette & )

PS: хотя возможно я уже переработал)


Название: Непонятный сегфолт
Отправлено: pakulo от Июнь 18, 2007, 19:30
QPushButton - а как ты его хочешь в ХР раскрасить со стилем Xp style?
Может попробывать применить setStyleSheet ? и не будет проблем, можно и рамку будет красивую сделать, в зависимости от выбраного цвета ))


Название: Непонятный сегфолт
Отправлено: Tonal от Июнь 18, 2007, 20:03
А какой-нибудь стек вызовов ты можешь получить?
Или хотя бы точное сообщение об ошибке.
Ошибка похожа на обращению по нулевому или неинициализированному указателю.

Да, версию Qt и компилера тоже полезно сообщать. ;-)


Название: Непонятный сегфолт
Отправлено: pastor от Июнь 18, 2007, 20:14
Попорбуй так:

Код:

void TColorChoser::setColor(const QColor &color)
{
   QPalette palette(colorSelect->palette());
   palette.setColor(QPalette::Button, color);
   colorSelect->setPalette(palette);
}


Название: Непонятный сегфолт
Отправлено: troorl от Июнь 18, 2007, 21:00
Люди! Творится что-то дьявольское и непонятное! Для проверки изменил метод на такой:
Код:
void TColorChoser::setColor(QColor color)
{
QMessageBox::critical(0, "", color.name());
tmp_color = color;
}

Когда приходит время, мне выскакивает правильный цвет в сообщении. Затем сегфолт... tmp_color объявлен как член класса QColor tmp_color; В конструкторе на всякий пожарный я его инициализирую чёрным цветом.
Я уже просто в шоке сижу и ничего не понимаю...

Qt-4.2, GCC-4.1.2


Название: Непонятный сегфолт
Отправлено: Tonal от Июнь 19, 2007, 08:08
Как пить дать забыл инициализировать виджет и в указателе на него 0 или мусор.


Название: Непонятный сегфолт
Отправлено: troorl от Июнь 19, 2007, 11:16
Цитата: "Tonal"
Как пить дать забыл инициализировать виджет и в указателе на него 0 или мусор.

Не, не то. Виджет уже создался вместе с окошком и уже принял цвет в конструкторе окна, то есть он УЖЕ использовал этот злополучный метод. А сегфолт наблюдается при работе программы, причём при первом же вызове этого тупого метода :cry:


Название: Непонятный сегфолт
Отправлено: Steven_Orko от Июнь 19, 2007, 11:32
Приведи код конструктора


Название: Непонятный сегфолт
Отправлено: Alex03 от Июнь 19, 2007, 11:33
Цитата: "troorl"
Цитата: "Tonal"
Как пить дать забыл инициализировать виджет и в указателе на него 0 или мусор.

Не, не то. Виджет уже создался вместе с окошком и уже принял цвет в конструкторе окна

А в том же конструкторе оно случайно не в локальной переменной создаётся (с тем же именем что и мембер).