Ich möchte mouseReleaseEvent mit einer Reihe von QActions und QMenus überschreiben ...
connect(action1, SIGNAL(triggered()), this, SLOT(onStepIncreased()));
connect(action5, SIGNAL(triggered()), this, SLOT(onStepIncreased()));
connect(action10, SIGNAL(triggered()), this, SLOT(onStepIncreased()));
connect(action25, SIGNAL(triggered()), this, SLOT(onStepIncreased()));
connect(action50, SIGNAL(triggered()), this, SLOT(onStepIncreased()));
Ich möchte dem Slot ein Argument übergeben onStepIncreased
(wie Sie sich vorstellen können, sind es 1,5,10,25,50). Weißt du, wie ich das machen kann?
qt
qsignalmapper
qt-slot
Fatih Arslan
quelle
quelle
Antworten:
Verwenden Sie QSignalMapper . So was:
QSignalMapper* signalMapper = new QSignalMapper (this) ; connect (action1, SIGNAL(triggered()), signalMapper, SLOT(map())) ; connect (action5, SIGNAL(triggered()), signalMapper, SLOT(map())) ; connect (action10, SIGNAL(triggered()), signalMapper, SLOT(map())) ; connect (action25, SIGNAL(triggered()), signalMapper, SLOT(map())) ; connect (action50, SIGNAL(triggered()), signalMapper, SLOT(map())) ; signalMapper -> setMapping (action1, 1) ; signalMapper -> setMapping (action5, 5) ; signalMapper -> setMapping (action10, 10) ; signalMapper -> setMapping (action25, 25) ; signalMapper -> setMapping (action50, 50) ; connect (signalMapper, SIGNAL(mapped(int)), this, SLOT(onStepIncreased(int))) ;
quelle
context
Parameter a auf eine Klasse abzielt, die keinen Zugriff auf die Aktionen hat? In beiden Fällen hätte dercontext
Signalmapper keinen Zugriff auf die Aktionen, oder wenn ich den Signalmapper in derselben Klasse hätte, wäre dies der falsche Kontext für die Verbindungssteckplätze.Mit Qt 5 und einem C ++ 11-Compiler besteht die idiomatische Möglichkeit, solche Dinge zu tun, darin, einem Funktor Folgendes zu geben
connect
:connect(action1, &QAction::triggered, this, [this]{ onStepIncreased(1); }); connect(action5, &QAction::triggered, this, [this]{ onStepIncreased(5); }); connect(action10, &QAction::triggered, this, [this]{ onStepIncreased(10); }); connect(action25, &QAction::triggered, this, [this]{ onStepIncreased(25); }); connect(action50, &QAction::triggered, this, [this]{ onStepIncreased(50); });
Das dritte Argument
connect
ist nominell optional. Es wird verwendet, um den Thread-Kontext einzurichten, in dem der Funktor ausgeführt wird. Es ist immer notwendig, wenn der Funktor eineQObject
Instanz verwendet. Wenn der Funktor mehrereQObject
Instanzen verwendet, sollte er ein gemeinsames übergeordnetes Element haben, das seine Lebensdauer verwaltet, und der Funktor sollte sich auf dieses übergeordnete Element beziehen, oder es sollte sichergestellt werden, dass die Objekte den Funktor überleben.Unter Windows funktioniert dies in MSVC2012 und höher.
quelle
SIGNAL(triggered(bool))
anstelle von verwende&QAction::triggered
. Kann mir bitte jemand erklären warum?QObject::connect
Überladung, die einconst char *
als zweites Argument und einen Funktor als drittes oder viertes Argument verwendet. Die Qt4-connect
Syntax passt nicht zur neuen Syntax. Wenn Sie die alte Syntax verwenden möchten, verlieren Sie die einfache Verbindung zu Funktoren (obwohl dies angenähert werden könnte, wenn Sie einen C ++ 11-Compiler hätten, aber Qt 4 verwenden).Die
QObject::sender()
Funktion gibt einen Zeiger auf das Objekt zurück, das dem Slot signalisiert hat. Sie können dies verwenden, um herauszufinden, welche Aktion ausgelöst wurdequelle
Möglicherweise können Sie QAction mit einer Mitgliedsvariablen m_increase unterordnen.
Verbinden Sie das Triggered () - Signal mit einem Steckplatz in Ihrer neuen QAction-Unterklasse und senden Sie ein neues Signal (z. B. Triggered (Int-Nummer)) mit dem richtigen Parameter aus.
z.B
class MyAction:public QAction { public: MyAction(int increase, ...) :QAction(...), m_increase(increase) { connect(this, SIGNAL(triggered()), this, SLOT(onTriggered())); } protected Q_SLOTS: void onTriggered() { emit triggered(m_increase); } Q_SIGNALS: void triggered(int increase); private: int m_increase; };
quelle
QVector<QAction*> W(100); W[1]= action1; W[5]= action5; W[10]= action10; W[25]= action25; W[50]= action50; for (int i=0; i<100; ++i) { QSignalMapper* signalmapper = new QSignalMapper(); connect (W[i], SIGNAL(triggered()), signalmapper, SLOT(map())) ; signalmapper ->setMapping (W[i], i); connect (signalmapper , SIGNAL(mapped(int)), this, SLOT(onStepIncreased(int))); }
quelle