Слоты и сигналы Qt

447
28 декабря 2016, 04:29

Есть виджет, назовем его Link, и окно MainWindow. Нужно сделать так, чтобы по нажатию на виджет Link выполнялось какое-то действие из MainWindow, например отрисовка еще одного виджета.
Сделал обработку нажатия на виджет, то есть при нажатии на Link в нем вызывается слот, но как вызвать слот или отправить сигнал в MainWindow не могу понять, ведь они друг о друге ничего не знают и передать MainWindow в конструктор Link'y никак не получится, да и не логично это.
На самом деле структура намного сложнее и привести примеры кода не получится, т.к. его слишком много, но суть проблемы я описал

Answer 1

Если я вас правильно понял, вопрос заключается в том, как послать сигнал от одного виждета другому. Это делается примерно так:

В классе Link объявим сигнал clicked и отправим его в методе foo

class Link : public QWidget{
    Q_OBJECT
//...
signals:
    void clicked();
public:
    void foo(){
        emit clicked();
    }
};

В классе MainWindow объявим слот doSmth:

class MainWindow : public QWidget{
    Q_OBJECT
public slots:
    void doSmth(){
         //...
    }
};

Соединим:

Link *link = new Link;
MainWindow *mainWindow = new MainWindow;
connect(link, SIGNAL(clicked()),  mainWindow, SLOT(doSmth()));

Или если вы используете новый синтаксис:

connect(link, &Link::clicked,  mainWindow, &MainWindow::doSmth);

Теперь при вызове метода foo у link будет выполнен слот doSmth у mainWindow

READ ALSO
Статическая переменная map. Использование как словарь [требует правки]

Статическая переменная map. Использование как словарь [требует правки]

Использую статические открытые переменные типа QMapЗаполнение произвожу с помощью статической функции, которая возвращает QMap

376
Ошибка компиляции при обобщении типов

Ошибка компиляции при обобщении типов

Есть некоторая функция, принимающая в качестве аргумента вектор любого типа через шаблон

363
Вывод на экран и в файл

Вывод на экран и в файл

Нужно вывести одно и то же на экран и в файл, например:

359
Решить задачу по программирыванию С++ [требует правки]

Решить задачу по программирыванию С++ [требует правки]

Составить функцию, позволяющую определить позицию первого вхождения в заданный строку некоторого символа с другой заданной строкиРезультатом...

385