Qt я могу подключить сигналы / слоты к себе в конструкторе?
РЕДАКТИРОВАТЬ: не относится к сигналам / слоты / подключения. Проблема заключалась в том, что конструктор вызывал конструктор.
Возможно, есть лучший способ сделать это - мне было бы интересно услышать эти ...
У меня есть MyClass, который является производным от QLabel. Я хочу передать больше данных о производном классе обратно в сигнал, чем то, что делает базовый сигнал. Поэтому я создал слот для перехвата сигнала customContextMenuRequested и передачи пересмотренного сигнала, содержащего больше данных.
Когда я пытаюсь подключить этот сигнал в конструкторе, мой слот никогда не вызывается. Но если я перенесу Политику и соединю строки с родительским виджетом (а не с родителем иерархии классов), чтобы они выполнялись после полного построения MyClass, тогда мой слот будет вызван. Но я всегда хочу, чтобы это было связано с этим классом, и мне кажется, что я хотел бы, чтобы он был в его конструкторе, а не рассчитывал на то, что родительский класс не забудет это сделать.
Есть ли что-то, что я делаю неправильно? Или лучший способ добавить данные в сигнал?
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);
}
Поэтому я бы хотел, чтобы родительский виджет просто искал customContextMenuRequestedForCell, но сейчас родительский виджет, похоже, должен также отвечать за customContextMenuRequested.