我遇到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)));
答案 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
个字符串。