Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > QListWidget subclass


Автор: Annihilator 12.2.2010, 21:54
Создал производный класс от QListWidget

Код

class CustomListWidget : public QListWidget
{
Q_OBJECT
public:
    explicit CustomListWidget(QWidget *parent = 0);

signals:

public slots:

public:
    int currentItemIndex;
    QListWidgetItem *currentItem;

protected:
    void currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous );
    void itemPressed ( QListWidgetItem * item );
    void paintEvent(QPaintEvent *pe);
    void currentRowChanged(int currentRow);
    void keyPressEvent(QKeyEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
};


Вставил в него 3 итема (строки)

определил обработчики событий

Код

void CustomListWidget::currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous )
{

}

void CustomListWidget::currentRowChanged(int currentRow)
{
}

void CustomListWidget::itemPressed ( QListWidgetItem * item )
{

}

void CustomListWidget::paintEvent(QPaintEvent *pe)
{

}

void CustomListWidget::keyPressEvent(QKeyEvent *ev)
{

}

void CustomListWidget::mouseMoveEvent(QMouseEvent *ev)
{

}


Проблема в том, что отрабатывают обработчики только mouseMoveEvent, keyPressEvent и paintEvent
Остальные при переключении итемов либо при клике на них, не хотят работать. В чем дело? На несабклассированном виджете все нормально работает. Что-то не так определил?

Автор: Annihilator 14.2.2010, 09:19
Кое в чем ошибся. Дело в том, что 
Код

void currentItemChanged ( QListWidgetItem * current, QListWidgetItem * previous );
void itemPressed ( QListWidgetItem * item );
void currentRowChanged(int currentRow);


это не события, а сигналыsmile 
Соответственно, для обработки нужны слоты. Допустим, на примере itemPressed.

Определяем в хедере что-то типа:
Код

void itemPressed_slot ( QListWidgetItem * item );


затем в *.cpp в конструкторе CustomListWidget`а пишем:
Код

QObject::connect(this, SIGNAL(itemPressed( QListWidgetItem*)), SLOT(itemPressed_slot( QListWidgetItem*)));


ну и, соответственно, реализацию слота:
Код

void CustomListWidget::itemPressed_slot ( QListWidgetItem * item )
{/*..............*/}

и все работает

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)