2014-09-19 3 views
0

У меня проблема с сигналами и слотами Qt. Я просто изучаю Qt, но у меня много опыта на C++. Я получил класс из QTreeView, и я хочу обработать сигнал с разрешением столбца. Слот никогда не вызывается, и я вижу это в «Output Application»:Сопоставление сигнала базового класса Qt с слотом в производном классе

QObject::connect: No such signal TRecListingView::columnResized(int,int,int) in ../ec5/reclistingwidget.cpp:142 

Объявление класса выглядит следующим образом:

class TRecListingView : public QTreeView 
{ 
    Q_OBJECT 
public: 
    TRecListingView(QWidget *parent, TTopicPtr topic); 
    ~TRecListingView(); 

private slots: 
    void onColumnResized(int index, int oldsize, int newsize); 

private: 
    TRecListingModel *Model = 0; 
}; 

В конструкторе я это делаю:

connect(this,SIGNAL(columnResized(int,int,int)), 
     this,SLOT(onColumnResized(int,int,int))); 

У меня было это раньше, прежде чем я реализовал производный класс. Затем я отображал сигнал в слот в родительском виджетах.

Я попытался запустить qmake и перестроить проект. Я также попытался это:

QTreeView *tv = this; 
connect(tv,SIGNAL(columnResized(int,int,int)), 
     this,SLOT(onColumnResized(int,int,int))); 

ответ

1

columnResized не является сигналом, но слот, так что вы не можете подключиться к нему.

Вместо этого вы можете подключиться к QHeaderView::sectionResized

connect(this->horizontalHeader(),SIGNAL(sectionResized(int,int,int)), 
     this,     SLOT(onColumnResized(int,int,int))); 
+0

QTableView не имеет горизонтальногоHeader(), просто заголовок(). Поэтому я получил работу с этим: connect (this-> header(), SIGNAL (sectionResized (int, int, int)), это, SLOT (onColumnResized (int, int, int))); – nicktook

0

Потому что это не сигнал:

Из документации:

void QTreeView::columnResized (int column, int oldSize, int newSize) [protected slot] 

Постарайся переописать его:

#include <QTreeView> 
#include <QHeaderView> 
#include <QTimer> 
#include <QDebug> 


class TRecListingView : public QTreeView 
{ 
    Q_OBJECT 
public: 
    TRecListingView(QWidget *parent=0): 
     QTreeView(parent) 

    { 
     QTimer::singleShot(0, this, SLOT(fixHeader())); 
    } 


public slots: 

    void fixHeader() 
    { 
     QHeaderView *hv = new QHeaderView(Qt::Horizontal, this); 
     hv->setHighlightSections(true); 
     this->setHeader(hv); 
     hv->show(); 
    } 
protected slots: 
    void columnResized(int a, int b, int col) 
    { 
     qDebug() << "This is called"; 
    } 

public slots: 

}; 

Простого использование:

TRecListingView trec; 

QStringList stringList; 
stringList << "#hello" << "#quit" << "#bye"; 
QStringListModel *mdl = new QStringListModel(stringList); 
trec.setModel(mdl); 
trec.show(); 

Теперь она работает должным образом, и при изменении размера заголовка, вы увидите много This is called строк.

+0

Я пробовал это. Функция никогда не вызывается. – nicktook

+0

На самом деле вы не можете переопределить его, поскольку он не является виртуальным, но вы можете подключиться к сигналу 'QHeaderView :: sectionResized' –

+0

@nicktook есть один способ его изменить. Я полностью переписал свой ответ, и теперь работает пример (я тестировал его на своем компьютере). Смотрите, пожалуйста. – Chernobyl

Смежные вопросы