crossplatform.ru

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

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


Студент
*

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

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




Репутация:   0  


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

отлично работает если вызывать
MyTileWidget tile;
tile.show();

и никак если
Table table;
table.show();

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


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

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

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




Репутация:   44  


Покажи код, как ты сейчас все делаешь.
:blink:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 10.10.2009, 12:40
Сообщение #13


Студент
*

Группа: Участник
Сообщений: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.10.2009, 12:51
Сообщение #14


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

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

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




Репутация:   94  


void MyTileWidget::slotChangeColor(QString type)
{
    QAction* a = qobject_cast<QAction*>(sender());
    if(a){
        QString s = a->text();
        switch(s){
        // разбор соответствий
        }
    {
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 10.10.2009, 13:09
Сообщение #15


Студент
*

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.10.2009, 13:51) *
void MyTileWidget::slotChangeColor(QString type)
{
    QAction* a = qobject_cast<QAction*>(sender());
    if(a){
        QString s = a->text();
        switch(s){
        // разбор соответствий
        }
    {
}

спасибо, работает :), но опять же только с единичным объектом при вызове mytilewidget.show(), все как надо цвет меняет, оповещает о выборе, а с table.show() опять лишь на половину, оповещает, а цвет не удается сменить
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 10.10.2009, 13:25
Сообщение #16


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

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

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




Репутация:   44  


Цитата(votan @ 10.10.2009, 14:09) *
а с table.show() опять лишь на половину, оповещает, а цвет не удается сменить

Не знаю как там на половину, но мне пришлось покопаться в коде.... ;)

Сообщение отредактировал BRE - 10.10.2009, 13:28
Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  test.tar.gz ( 1,6 килобайт ) Кол-во скачиваний: 332
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
votan
  опции профиля:
сообщение 10.10.2009, 13:38
Сообщение #17


Студент
*

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

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




Репутация:   0  


спасибо большое :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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