crossplatform.ru

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

> проблема с 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);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
votan
  опции профиля:
сообщение 10.10.2009, 12:40
Сообщение #2


Студент
*

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

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




Репутация:   0  


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

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

вроде понимаю, но как тогда получить из sender() текст с кнопки? iconText() и text() не работают если отправителем является QAction

вот полностью весь проект
Раскрывающийся текст

main.cpp

#include <QtGui>
#include "table.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Table table;
    table.show();
    return a.exec();
}


mywidget.cpp

#include "mywidget.h"

MyTileWidget::MyTileWidget()
{
   // palette.setColor(QPalette::Background,Qt::red);
   // setPalette(palette);
    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)));


    QMenu* submenuOne = new QMenu("Sub menu one",menu);
    QMenu* subsubmenuTwo = new QMenu("Sub sub menu",menu);
    QMenu* subsubmenuThree = new QMenu("Sub menu three",menu);

    subsubmenuThree->addAction(new QAction("subsubpt13",subsubmenuThree));
    subsubmenuThree->addAction(new QAction("subsubpt23",subsubmenuThree));
    subsubmenuThree->addAction(new QAction("subsubpt33",subsubmenuThree));

    subsubmenuTwo->addAction(new QAction("subsubpt1",subsubmenuTwo));
    subsubmenuTwo->addAction(new QAction("subsubpt2",subsubmenuTwo));
    subsubmenuTwo->addMenu(subsubmenuThree);

    submenuOne->addAction(new QAction("subpt1",submenuOne));
    submenuOne->addAction(new QAction("subpt2",submenuOne));
    submenuOne->addMenu(subsubmenuTwo);

    menu->addMenu(submenuOne);

    setFixedSize(QSize(60,90));
}

void MyTileWidget::paintEvent(QPaintEvent* ev)
{
    //QPainter painter(this);

    //painter.setFont(QFont("Arial", 20));
    //painter.drawText(rect().x()+height()/6,rect().y()+width(),"Tile");

   // painter.drawRect(QRect(0,0,width()-2,height()-2));
}

void MyTileWidget::mousePressEvent (QMouseEvent * event)
{
        if(event->buttons()==Qt::RightButton){
           menu->move(event->pos().x(),event->pos().y());
           menu->show();
       }
}

void MyTileWidget::slotChangeColor(QString type)
{
    if(type=="Pin"){
        setStyleSheet("background-color: rgb(224, 0, 0)");
        //qDebug()<<"Olol is PIN!";
        //qDebug()<<sender()->metaObject()->className();
    }
    else if(type=="Sou")
    {
        this->setStyleSheet("background-color: red");
        //qDebug()<<"Haha its SOU!";
    }
    else if(type=="Man")
        qDebug()<<"TT its MAN!";
        //pal.setColor(QPalette::Background,Qt::red);
    else
        qDebug()<<"Its not here!";

}


mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QtGui>
class MyTileWidget : public QWidget
{
    Q_OBJECT
private:
    QMenu* menu;
    QSignalMapper* signalMapper;
public:
    MyTileWidget();
    virtual void paintEvent(QPaintEvent*);
    virtual void mousePressEvent(QMouseEvent*);
public slots:
    void slotChangeColor(QString);
signals:
     void clicked(const QString &text);
};

#endif // MYWIDGET_H


table.cpp

#include "table.h"

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);
}


table.h

#ifndef TABLE_H
#define TABLE_H

#include <QtGui>
#include "mywidget.h"

class Table : public QWidget
{
Q_OBJECT
public:
    Table();
    void createTable();
};

#endif // TABLE_H
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- votan   проблема с QSignalMapper   10.10.2009, 11:06
- - kwisp   может дело в static_cast? тролли советуют qobject...   10.10.2009, 11:24
|- - BRE   Цитата(kwisp @ 10.10.2009, 12:24) может д...   10.10.2009, 11:29
- - kwisp   на QAction не обратил внимания. каюсь, однако чег...   10.10.2009, 11:36
- - votan   мне каким-то образом нужно получить доступ к конкр...   10.10.2009, 11:37
|- - BRE   Цитата(votan @ 10.10.2009, 12:37) мне как...   10.10.2009, 11:43
- - votan   Цитата(kwisp @ 10.10.2009, 12:36) на QAct...   10.10.2009, 11:49
- - kwisp   там не все так просто, если не ошибаюсь, палитра в...   10.10.2009, 11:52
|- - BRE   votan, попробуй менять цвет виджета не через палит...   10.10.2009, 12:09
- - Litkevich Yuriy   Цитата(votan @ 10.10.2009, 15:37) в моем ...   10.10.2009, 12:14
- - votan   Цитата(BRE @ 10.10.2009, 13:09) votan, по...   10.10.2009, 12:17
|- - BRE   Покажи код, как ты сейчас все делаешь.   10.10.2009, 12:21
- - votan   Цитата(Litkevich Yuriy @ 10.10.2009, 13:1...   10.10.2009, 12:40
- - Litkevich Yuriy   void MyTileWidget::slotChangeColor(QSt...   10.10.2009, 12:51
- - votan   Цитата(Litkevich Yuriy @ 10.10.2009, 13:5...   10.10.2009, 13:09
|- - BRE   Цитата(votan @ 10.10.2009, 14:09) а с tab...   10.10.2009, 13:25
- - votan   спасибо большое   10.10.2009, 13:38


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


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




RSS Текстовая версия Сейчас: 5.12.2024, 3:43