Qt Unterklassen und "Keine passende Funktion für Aufruf von connect"
Ich versuche zu Kapseln Tabellenansicht Verhalten und fange mit Verbindungs-Tabelle Ansicht-Kopf-Signale, um die Tabelle anzuzeigen slots definiert, die in der Unterklasse. Ich kann das Verhalten, das ich bin auf der Suche nach ohne Erben, sondern dass Niederlagen der Zweck. Wenn ich versuche, Unterklasse, ich bekomme die gefürchtete "No matching function call zu verbinden. Alle Komponenten sind letztendlich QObjects, also denke ich nicht, dass ist das problem. (Aber dann wieder, vielleicht das IST das problem.) Jetzt bin ich die Verbindung zur 'hideColumn()', aber ich würde irgendwann gerne eine Verbindung zu meinem eigenen slots (wie 'my_sectionClicked(int)'.
Den code unten gezogen wurde, von der Quelle für "C++ GUI Programmierung mit Qt 4" von Jasmin Blanchette und Mark Summerfield-mit Ausnahme der "MyTableView" Ergänzung, die ich gemacht habe.
MyTableView.h
#ifndef MYTABLEVIEW_HPP
#define MYTABLEVIEW_HPP
#include <QTableView>
class MyTableView : public QTableView
{
Q_OBJECT
public:
explicit MyTableView(QWidget *parent = 0);
public slots:
void my_sectionClicked(int logicalIndex);
private slots:
public:
private:
QHeaderView *m_rowHeader;
};
#endif //MYTABLEVIEW_HPP
MyTableView.cpp
//Qt Includes
#include <QDebug>
#include <QMenu>
//Local Includes
#include "MyTableView.h"
MyTableView::MyTableView(QWidget *parent) : QTableView(parent)
{
m_rowHeader = horizontalHeader();
connect(m_rowHeader, SIGNAL(sectionClicked(int)), this, SLOT(hideColumn(int)));
}
void MyTableView::my_sectionClicked(int logicalIndex)
{
qDebug().nospace() << "Column " << logicalIndex << " selected." << "\n";
}
currencymodel.h
#ifndef CURRENCYMODEL_H
#define CURRENCYMODEL_H
#include <QAbstractTableModel>
#include <QMap>
class CurrencyModel : public QAbstractTableModel
{
public:
CurrencyModel(QObject *parent = 0);
void setCurrencyMap(const QMap<QString, double> &map);
int rowCount(const QModelIndex &parent) const;
int columnCount(const QModelIndex &parent) const;
QVariant data(const QModelIndex &index, int role) const;
QVariant headerData(int section, Qt::Orientation orientation,
int role) const;
private:
QString currencyAt(int offset) const;
QMap<QString, double> currencyMap;
};
#endif
currencymodel.cpp
#include <QtCore>
#include "currencymodel.h"
CurrencyModel::CurrencyModel(QObject *parent)
: QAbstractTableModel(parent)
{
}
void CurrencyModel::setCurrencyMap(const QMap<QString, double> &map)
{
currencyMap = map;
reset(); //Forces views to refresh data
}
int CurrencyModel::rowCount(const QModelIndex & /* parent */) const
{
return currencyMap.count();
}
int CurrencyModel::columnCount(const QModelIndex & /* parent */) const
{
return currencyMap.count();
}
QVariant CurrencyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::TextAlignmentRole)
{
return int(Qt::AlignRight | Qt::AlignVCenter);
}
else if (role == Qt::DisplayRole)
{
QString rowCurrency = currencyAt(index.row());
QString columnCurrency = currencyAt(index.column());
if (currencyMap.value(rowCurrency) == 0.0)
return "####";
double amount = currencyMap.value(columnCurrency)
/ currencyMap.value(rowCurrency);
return QString("%1").arg(amount, 0, 'f', 4);
}
return QVariant();
}
QVariant CurrencyModel::headerData(int section,
Qt::Orientation /* orientation */,
int role) const
{
if (role != Qt::DisplayRole)
return QVariant();
return currencyAt(section);
}
QString CurrencyModel::currencyAt(int offset) const
{
return (currencyMap.begin() + offset).key();
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtGui>
#include "MyTableView.h"
#include "currencymodel.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow();
protected:
private slots:
void on_sectionClicked(int locicalIndex);
private:
QMap<QString, double> currencyMap;
CurrencyModel currencyModel;
QTableView tableView;
QHeaderView *m_rowHeader;
};
#endif
mainwindow.cpp
#include <iostream>
#include "mainwindow.h"
MainWindow::MainWindow()
{
currencyMap.insert("AUD", 1.3259);
currencyMap.insert("CHF", 1.2970);
currencyMap.insert("CZK", 24.510);
currencyMap.insert("DKK", 6.2168);
currencyMap.insert("EUR", 0.8333);
currencyMap.insert("GBP", 0.5661);
currencyMap.insert("HKD", 7.7562);
currencyMap.insert("JPY", 112.92);
currencyMap.insert("NOK", 6.5200);
currencyMap.insert("NZD", 1.4697);
currencyMap.insert("SEK", 7.8180);
currencyMap.insert("SGD", 1.6901);
currencyMap.insert("USD", 1.0000);
currencyModel.setCurrencyMap(currencyMap);
/*
THIS WORKS!!!
m_rowHeader = tableView.horizontalHeader();
connect(m_rowHeader, SIGNAL(sectionClicked(int)),
&(tableView), SLOT(hideColumn(int)));
*/
tableView.setModel(¤cyModel);
tableView.setAlternatingRowColors(true);
tableView.setWindowTitle(QObject::tr("Currencies"));
tableView.show();
}
void MainWindow::on_sectionClicked(int logicalIndex)
{
qDebug().nospace() << "Column " << logicalIndex << " selected." << "\n";
}
main.cpp
#include "mainwindow.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MainWindow mainWin;
return app.exec();
}
Den Fehler den ich bekomme, ist:
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/mkspecs/default -I. -I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore -I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtGui -I/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include -I. -I. -o MyTableView.o MyTableView.cpp
MyTableView.cpp: In constructor ‘MyTableView::MyTableView(QWidget*)’:
MyTableView.cpp:11: error: no matching function for call to ‘MyTableView::connect(QHeaderView*&, const char [21], MyTableView* const, const char [17])’
/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qobject.h:204: note: candidates are: static bool QObject::connect(const QObject*, const char*, const QObject*, const char*, Qt::ConnectionType)
/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qobject.h:217: note: static bool QObject::connect(const QObject*, const QMetaMethod&, const QObject*, const QMetaMethod&, Qt::ConnectionType)
/opt/QtSDK/Desktop/Qt/4.8.1/gcc/include/QtCore/qobject.h:337: note: bool QObject::connect(const QObject*, const char*, const char*, Qt::ConnectionType) const
make: *** [MyTableView.o] Error 1
- Wo ist my_sectionClicked verwendet?
- tl;dr. Poste nur den relevanten code.
- An einem Punkt der Verbindung zu
hideColumn(int)
war eine Verbindung zumy_sectionClicked(int)
. Ich habe ihn an einer bestehenden Qt-slot als ein Prozess der Beseitigung, die bei der Fehlersuche.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Art von problem ist in der Regel verursacht, wenn Sie vorbei sind eine Klasse, die wurde vorne erklärt, aber nicht
#include
'dIn Ihrem Fall sieht es aus wie Sie benötigen wahrscheinlich eine
#include <QHeaderView>
in Ihrem MyTableView.cpp Datei.Das Problem ist, dass Sie übergeben können, um Zeiger auf Objekte wurden forward deklariert, aber der compiler weiß nicht, dass Ihre Klasse ist letztlich abgeleitet von
QObject
, so ist es nicht erlaubt, die Nutzung Ihrer Unterklasse Zeiger alsQObject
Zeiger beim Aufruf derconnect()
Funktion.