Russian Qt Forum
Ноябрь 24, 2024, 16:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятный сегфолт  (Прочитано 6885 раз)
troorl
Гость
« : Июнь 18, 2007, 18:08 »

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

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

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Июнь 18, 2007, 19:29 »

мне кажется что дело в том
что pallete ваша локальная функция и гибнет вместе с концом функции

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

PS: хотя возможно я уже переработал)
Записан
pakulo
Гость
« Ответ #2 : Июнь 18, 2007, 19:30 »

QPushButton - а как ты его хочешь в ХР раскрасить со стилем Xp style?
Может попробывать применить setStyleSheet ? и не будет проблем, можно и рамку будет красивую сделать, в зависимости от выбраного цвета ))
Записан
Tonal
Гость
« Ответ #3 : Июнь 18, 2007, 20:03 »

А какой-нибудь стек вызовов ты можешь получить?
Или хотя бы точное сообщение об ошибке.
Ошибка похожа на обращению по нулевому или неинициализированному указателю.

Да, версию Qt и компилера тоже полезно сообщать. ;-)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Июнь 18, 2007, 20:14 »

Попорбуй так:

Код:

void TColorChoser::setColor(const QColor &color)
{
   QPalette palette(colorSelect->palette());
   palette.setColor(QPalette::Button, color);
   colorSelect->setPalette(palette);
}
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
troorl
Гость
« Ответ #5 : Июнь 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
Гость
« Ответ #6 : Июнь 19, 2007, 08:08 »

Как пить дать забыл инициализировать виджет и в указателе на него 0 или мусор.
Записан
troorl
Гость
« Ответ #7 : Июнь 19, 2007, 11:16 »

Цитата: "Tonal"
Как пить дать забыл инициализировать виджет и в указателе на него 0 или мусор.

Не, не то. Виджет уже создался вместе с окошком и уже принял цвет в конструкторе окна, то есть он УЖЕ использовал этот злополучный метод. А сегфолт наблюдается при работе программы, причём при первом же вызове этого тупого метода :cry:
Записан
Steven_Orko
Гость
« Ответ #8 : Июнь 19, 2007, 11:32 »

Приведи код конструктора
Записан
Alex03
Гость
« Ответ #9 : Июнь 19, 2007, 11:33 »

Цитата: "troorl"
Цитата: "Tonal"
Как пить дать забыл инициализировать виджет и в указателе на него 0 или мусор.

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

А в том же конструкторе оно случайно не в локальной переменной создаётся (с тем же именем что и мембер).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.17 секунд. Запросов: 22.