crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> проблема с QSignalMapper
votan
  опции профиля:
сообщение 10.10.2009, 11:06
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, собственно проблема заключается в том что объекты не могут поставить на себя QPalette
кусок инициализации маппера
MyTileWidget::MyTileWidget()
{
    signalMapper = new QSignalMapper(this);
    menu = new QMenu;

    QVector<QString> tilesType;
    tilesType.append(QString("Pin"));
    tilesType.append(QString("Sou"));
    tilesType.append(QString("Man"));

    foreach(QString type, tilesType){
        QAction* action = new QAction(type,menu);
        QObject::connect(action,SIGNAL(triggered()),signalMapper,SLOT(map()));
        signalMapper->setMapping(action,type);
        menu->addAction(action);
    }

    QObject::connect(signalMapper,SIGNAL(mapped(QString)),this,SIGNAL(clicked(QString)));
    QObject::connect(this,SIGNAL(clicked(QString)),this,SLOT(slotChangeColor(QString)));
    ..........
}

void MyTileWidget::slotChangeColor(QString type)
{
    QPalette palette;
    if(type=="Pin")
        palette.setColor(QPalette::Background,Qt::black);
        //qDebug()<<"Olol is PIN!";
    else if(type=="Sou")
        qDebug()<<"Haha its SOU!";
        //palette.setColor(QPalette::Background,Qt::green);
    else if(type=="Man")
        qDebug()<<"TT its MAN!";
        //palette.setColor(QPalette::Background,Qt::red);
    else
        qDebug()<<"Its not here!";
    
setPalette(palette);
    //
    QObject* obj = signalMapper->mapping(type);
    (static_cast <QWidget*>(obj))->setPalette(palette);
}


в слоте slotChangeColor пытался, приводить возвращаемый указатель, и просто устанавливать this->setPalette(), работать отказывается, хотя если отображать объект сразу, то все работает как надо, у меня же 14 объектов располагаются в другом объекте, и он заходит и выводит сообщения по qDebug(), но палитру менять отказывается
Table::Table()
{
    createTable();
}

void Table::createTable()
{
    QHBoxLayout* layout = new QHBoxLayout;
    QVector<MyTileWidget*> tiles;
    for(int i=0; i<15; ++i)
        tiles.append(new MyTileWidget);

    foreach(MyTileWidget* tile, tiles)
        layout->addWidget(tile);

    setLayout(layout);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.10.2009, 11:24
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


может дело в static_cast?
тролли советуют
qobject_cast
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2009, 11:29
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(kwisp @ 10.10.2009, 12:24) *
может дело в static_cast?
тролли советуют
qobject_cast

Такое приведение типов вообще не корректно. В маппере лежат объекты QAction, а их ну никак не приведешь в QWidget.
qobject_cast будет возвращать 0.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.10.2009, 11:36
Сообщение #4


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


на QAction не обратил внимания.
каюсь,
однако
чего тогда добиваются строчкой
(static_cast <QWidget*>(obj))->setPalette(palette);
привести QAction* к QWidget*
?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 10.10.2009, 11:37
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


мне каким-то образом нужно получить доступ к конкретному объекту( в моем случае, есть виджет, в нем 14 малых виджетов, в каждом малом виджете меню с маппером, при тыке на пункте меню переходим в слот в который отправляется надпись кнопки меню, и исходя из надписи пытаемся поставить нужный фон на кликнутый малый виджет)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2009, 11:43
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(votan @ 10.10.2009, 12:37) *
мне каким-то образом нужно получить доступ к конкретному объекту

Так ты и так получаешь доступ к нужному объекту (для которого выполняется меню).
Что рекомендовал бы сделать:
void MyTileWidget::slotChangeColor(QString type)
{
    QPalette pal = palette();    // Получить палитру виджета

    ...    // Поменять один их цветов

    setPalette( pal );    // Установить палитру
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 10.10.2009, 11:49
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 25
Регистрация: 6.7.2009
Пользователь №: 879

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(kwisp @ 10.10.2009, 12:36) *
на QAction не обратил внимания.
каюсь,
однако
чего тогда добиваются строчкой
(static_cast <QWidget*>(obj))->setPalette(palette);
привести QAction* к QWidget*
?

ничего, просто от безысходности :lol:

сама идея использования маппера была в том чтобы передавать надписи с кнопок меню, а уже исходя из надписи ставить нужный фон, но кажется я не допонял чего-то в маппере

Цитата(BRE @ 10.10.2009, 12:43) *
Цитата(votan @ 10.10.2009, 12:37) *
мне каким-то образом нужно получить доступ к конкретному объекту

Так ты и так получаешь доступ к нужному объекту (для которого выполняется меню).
Что рекомендовал бы сделать:
void MyTileWidget::slotChangeColor(QString type)
{
    QPalette pal = palette();    // Получить палитру виджета

    ...    // Поменять один их цветов

    setPalette( pal );    // Установить палитру
}



поменял, но эффекта по прежнему нету
void MyTileWidget::slotChangeColor(QString type)
{
    QPalette pal = palette();
    if(type=="Pin")
        pal.setBrush(QPalette::Background,Qt::black);
        //qDebug()<<"Olol is PIN!";
    else if(type=="Sou")
        pal.setColor(QPalette::Background,Qt::green);
        //qDebug()<<"Haha its SOU!";
    else if(type=="Man")
        qDebug()<<"TT its MAN!";
        //pal.setColor(QPalette::Background,Qt::red);
    else
        qDebug()<<"Its not here!";
    setPalette(pal);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 10.10.2009, 11:52
Сообщение #8


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


там не все так просто, если не ошибаюсь, палитра виджета зависит от палитры хозяина и важен флаг QWidget::autoFillBackground.
с темами XP не работает

Сообщение отредактировал kwisp - 10.10.2009, 11:58
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2009, 12:09
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


votan, попробуй менять цвет виджета не через палитру, а используя stylesheet.
setStyleSheet("background-color: yellow");
setStyleSheet("background-color: rgb(224, 0, 0)");

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.10.2009, 12:14
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(votan @ 10.10.2009, 15:37) *
в моем случае, есть виджет, в нем 14 малых виджетов, в каждом малом виджете меню с маппером, при тыке на пункте меню переходим в слот в который отправляется надпись кнопки меню, и исходя из надписи пытаемся поставить нужный фон на кликнутый малый виджет
получается, что у каждого малого виджета своё меню и оно нужно для смены цвета именно этого виджета.
Может тогда пойти класическим путём (в Qt). Сделать такой виджет с меню, соеденить "Клики по Действиям" с одним слотом, в слоте через sender() получать отправитель, зная что это "Действие" получить текст его, далее с помощью переключателя (switch) определить какой цвет установить.

Если эти малые виджеты должны как-то отличатся друг от друга, то использовать выше описанный виджет для наследования.
?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


13 чел. читают эту тему (гостей: 13, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.12.2024, 19:24