PDA

View Full Version : [Qt4] QtDesigner e custom slot


tomminno
02-12-2009, 08:14
Tramite QtDesigner una volta collegato ad esempio l'evento click di un QPushButton ad uno slot custom, poi come lo implemento?
QtDesigner mette tutto il suo codice in un file header che ovviamente viene rigenerato ad ogni modifica dell'interfaccia, quindi č impossibile anche solo aggiungere la definizione dello slot.
Ora quello che devo fare č gestire il click su un pulsante del QMainWindow per poi aprire un altro dialog, cosa semplicissima da fare via codice, ma a quanto pare ingestibile se si usa QtDesigner.
Che devo per forza creare una classe che deriva da QPushButton che gestisce l'evento click?
E cosė bisogna fare per ogni widget con eventi?
Se č cosė a che serve il mezzo supporto dato dal designer agli slot custom?

cionci
03-12-2009, 19:38
Ma lo slot custom come l'hai creato ?
Edit: cosė ? http://www.youtube.com/watch?v=Ca8ItRtU0AA

tomminno
04-12-2009, 11:29
Ma lo slot custom come l'hai creato ?
Edit: cosė ? http://www.youtube.com/watch?v=Ca8ItRtU0AA

Si.
Ho provato ad associare un signal textChanged di un QLineEdit ad un mio slot che ho definito in una classe derivata da QTableView. Ho definito nell'editor che la QTableView ereditasse dalla mia classe e ho aggiunto nell'editor gli slot che ho definito via codice. Lo scopo era di applicare un filtro sui dati visualizzati in base al testo corrente. Solo che lo slot non viene richiamato.

Questo č il codice della tabella:

class CustomTableView : public QTableView
{
public:
CustomTableView (QWidget * parent = 0) : QTableView(parent)
{
}

void setModel(QAbstractItemModel * model)
{
proxyModel = std::tr1::shared_ptr<QSortFilterProxyModel>(new QSortFilterProxyModel(this));
proxyModel->setSourceModel(model);
QTableView::setModel(proxyModel.get());
}
public slots:
void Filter(const QString & filter)
{
proxyModel->setFilterRegExp(QRegExp(filter));
proxyModel->setFilterKeyColumn(static_cast<ViewModels::AlbumViewModel*>(proxyModel->sourceModel())->GetAuthorColumn());
}
protected:
std::tr1::shared_ptr<QSortFilterProxyModel> proxyModel;
};


Questa č la riga di codice generata dal designer:

QObject::connect(filter, SIGNAL(textChanged(QString)), tableView, SLOT(Filter(QString)));

cionci
04-12-2009, 12:10
Ehm non ho capito qual'č il problema :stordita:

tomminno
04-12-2009, 13:23
Ehm non ho capito qual'č il problema :stordita:

Ehm non funziona :cry:
Ovviamente riesco a farlo funzionare se passo prima dalla QMainWindow e poi rimbalzo lo slot manualmente verso la tableView.

cionci
04-12-2009, 13:38
Q_OBJECT

The Q_OBJECT macro must appear in the private section of a class definition that declares its own signals and slots or that uses other services provided by Qt's meta-object system.

For example:

#include <QObject>

class Counter : public QObject
{
Q_OBJECT

public:
Counter() { m_value = 0; }

int value() const { return m_value; }

public slots:
void setValue(int value);

signals:
void valueChanged(int newValue);

private:
int m_value;
};

tomminno
04-12-2009, 13:54
:doh:
Grazie!