将Qt基类信号映射到派生类中的槽

时间:2014-09-19 20:17:29

标签: c++ qt

我遇到Qt信号和插槽问题。我刚刚学习Qt,但我有很多C ++经验。我从QTreeView派生了一个类,我想处理columnResized信号。永远不会调用插槽,我在“应用程序输出”中看到了这一点:

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

2 个答案:

答案 0 :(得分:1)

columnResized不是信号,而是插槽,因此您无法连接到它。

相反,您可以连接到QHeaderView::sectionResized

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

答案 1 :(得分: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个字符串。