Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ сигналы и слоты

Автор: demaker 30.1.2013, 17:14

Выдает ошибку

error: passing 'const TreeWidget' as 'this' argument of 'void TreeWidget::sg_itemChecked(QTreeWidgetItem*)' discards qualifiers

при

 connect(tree,SIGNAL(sg_itemChecked(QTreeWidgetItem*)),this,SLOT(sl_itemChecked(QTreeWidgetItem*)));


якобы вся штука в том что сигнал высылается из

 virtual QMimeData *    mimeData (const QList<QTreeWidgetItem *> items) const;


помошите не могу решить вопрос.

Автор: Авварон 30.1.2013, 18:04

Сделай сигнал константным. А нафига кидать сигнал из конст() функции?

Автор: Алексей1153 30.1.2013, 18:59

это не отправка сигнала, а соединение сигнала со слотом вообще то )

и всё как бы намекает, что из константной функции это сделать не получится напрямую

но если сильно хочется, можно попробовать

connect(tree,SIGNAL(sg_itemChecked(QTreeWidgetItem*)),static_cast<TreeWidget*>(this),SLOT(sl_itemChecked(QTreeWidgetItem*)));

Автор: demaker 31.1.2013, 9:05

да сделал сигнал константным

signals:
    void sg_itemChecked(QTreeWidgetItem*) const;


действительно помогло :)
Спасибо!

у меня возник такой вопрос. :unsure:

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

И так со всеми.

Не могу понять, может сигнал изначально не доходит :unsure:

вот код:

QMimeData * TreeWidget::mimeData (const QList<QTreeWidgetItem *> items) const
{
    QMimeData *mimeData = new QMimeData();
    QByteArray encodedData;


    foreach (QTreeWidgetItem* item, items)
    {
        qDebug() <<"index = " << fileName_Item->indexOfChild(item);
        qDebug()<<"data = "<<item->data(0,Qt::EditRole);

        emit sg_itemChecked(item);
        encodedData.append(item->data(0,Qt::EditRole).toByteArray());
    }

    mimeData->setData( "application/x-qt-windows-mime;value=\"ComtradeChannel\"", encodedData);
    return mimeData;
}



void Widget::sl_itemChecked(QTreeWidgetItem *item)
{
    item->setCheckState(0,Qt::Checked);
}


void Widget::dropEvent(QDropEvent *event)
{
if (event->mimeData()->hasFormat("application/x-qt-windows-mime;value=\"ComtradeChannel\""))
    {
        QByteArray d(event->mimeData()->data("application/x-qt-windows-mime;value=\"ComtradeChannel\""));
        qDebug()<<"d = "<<d;

        connect(tree,SIGNAL(sg_itemChecked(QTreeWidgetItem*)),this,SLOT(sl_itemChecked(QTreeWidgetItem*)));
    }
}

Автор: demaker 31.1.2013, 12:58

может
connect(tree,SIGNAL(sg_itemChecked(QTreeWidgetItem*)),this,SLOT(sl_itemChecked(Q
TreeWidgetItem*)));
в конструктор переместить

Автор: Алексей1153 31.1.2013, 13:05

demaker, здравая мысль )

Автор: demaker 1.2.2013, 13:19

Определил все и сигнал и слот

connect(items.at(index),SIGNAL(sg_unChecked(TreeWidgetItem*)),this,SLOT(sl_deletePlot(TreeWidgetItem*)));


и ВЫДАЕТ

no matching function for call to 'Widget::connect(TreeWidgetItem* const&, const char*, Widget* const, const char*)'

Автор: lanz 1.2.2013, 14:26

Чтобы использовать сигналы/слоты TreeWidgetItem и Widget должен наследовать от QObject.

Автор: demaker 1.2.2013, 14:49

Это понятно, т.е у меня TreeWidgetItem не наследуется от QObject?

class TreeWidgetItem: public QObject,public QTreeWidgetItem
{
    Q_OBJECT

public:
    Plot* p;

public:
    explicit TreeWidgetItem(TreeWidgetItem*parent);
    explicit TreeWidgetItem(QTreeWidget*parent);
    explicit TreeWidgetItem(QTreeWidgetItem*parent);
    ~TreeWidgetItem();

signals:
    void sg_unChecked();
};


Вы предлагайте так сделать

Автор: lanz 1.2.2013, 15:17

Не работает?

Автор: demaker 1.2.2013, 15:37

Да нет, работает :)
Спасибо

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)