F: Kann ich im Konstruktor Signale / Slots mit self verbinden?
EDIT: Nicht bezogen auf Signale / Slots / Connect. Problem war, dass der Konstruktor den Konstruktor aufrief.
Es könnte einen besseren Weg geben, dies zu tun - ich wäre daran interessiert, diese zu hören ...
Ich habe MyClass, das von einem QLabel abgeleitet ist. Ich möchte mehr Daten über die abgeleitete Klasse in das Signal zurückgeben als das Basissignal. Also habe ich einen Slot erstellt, um das customContextMenuRequested-Signal abzufangen und ein überarbeitetes Signal mit mehr Daten auszugeben.
Wenn ich versuche, dieses Signal im Konstruktor anzuschließen, wird mein Steckplatz nie aufgerufen. Wenn ich jedoch die Richtlinie verschiebe und Leitungen mit dem übergeordneten Widget (nicht mit dem übergeordneten Klassenhierarchie-Widget) verbinde, damit sie ausgeführt werden, nachdem MyClass vollständig erstellt wurde, wird mein Slot aufgerufen. Aber ich möchte immer, dass das für diese Klasse verbunden ist, und es scheint, als würde ich etwas in ihrem Konstruktor wollen, anstatt auf die Elternklasse zu zählen, um daran zu denken, dass sie es tut.
Gibt es etwas, was ich falsch mache? Oder eine bessere Möglichkeit, einem Signal Daten hinzuzufügen?
MyClass::MyClass() : QLabel()
{
QFont currFont = font();
currFont.setPointSize(15);
setFont(currFont);
setBackgroundRole(QPalette::Mid);
std::cout << "connecting customContextMenuRequested" << std::endl;
/** PROBLEM START */
setContextMenuPolicy(Qt::CustomContextMenu);
// Is there anything wrong with connecting from "this" to "this" in a constructor?
QObject::connect(this, SIGNAL(customContextMenuRequested(const QPoint&)),
this, SLOT(addCellDataToMenuContextRequest(const QPoint&)));
/* PROBLEM END **/
}
MyClass::MyClass(QString &cellString, int row, int col)
: QLabel(cellString)
{
MyClass();
setRow(row);
setCol(col);
}
// This one is a slot
void MyClass::addCellDataToMenuContextRequest(const QPoint& pos)
{
// This doesn't get printed if I connect in my constructor,
// but it does print if I do the same connect from a parent widget.
std::cout << "called addCellDataToMenuContextRequest" << std::endl;
emit customContextMenuRequestedForCell(pos, _row, _col);
}
Ich möchte also, dass das übergeordnete Widget nur nach customContextMenuRequestedForCell sucht. Derzeit muss das übergeordnete Widget jedoch auch für customContextMenuRequested verantwortlich sein.