@smirnovskoe
Keep calm и прогай

Qt — как передать сигнал?

Есть вопрос по передаче сигналов в Qt (мб это даже вопрос проектирования приложения...)
Допустим, у меня есть класс MainWindow : QMainWindow. Я поместил на форму QStackedWidget (или QTabWidget) c двумя страницами (вкладками). Причем, виджеты на вкладках, отдельные классы: ViewEditor: QWidget и TextEditor:QWidget (внутри каждого свои элементы находятся) . На вкладке ViewEditor находится QGraphicsView c QGraphicsScene. Сцена отображает QGraphicsItem (квадратики) . Я хочу чтобы при клике на квадратик, его ID выводился в QTextEdit на вкладке TextEditor:QWidget. Вопрос: при клике на квадратик делается emit SOME_SIGNAL . Этот emit улавливается сценой, и передается всем виджету по цепочке выше, пока не дойдет доQTextEdit. Есть ли более элегантный механизм передать сигнал из объекта в объект, если между ними есть еще объекты? Получается очень путанная последовательность сигналов и слотов...
  • Вопрос задан
  • 487 просмотров
Пригласить эксперта
Ответы на вопрос 2
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Этот emit улавливается сценой, и передается всем виджету по цепочке выше, пока не дойдет до QTextEdit.

Это не совсем так. Сигнал и событие -- разные вещи в Qt. Сигнал "улавливается" приёмниками, к которым он присоединён. Таких приёмников может быть ноль или несколько. Приёмник это обычно слот другого объекта или лямбда-функция.

То есть, если вы хотите что-то передать непосредственно в QTextEdit и там есть нужный вам слот, то можете соединить слот и сигнал напрямую. Если нет, то можете создать слот (или просто любой метод) в каком-нибудь классе, который наследуется от QObject и выполнить там необходимые преобразования. Ну или лямбда-функцию использовать.
Ответ написан
Комментировать
@smirnovskoe Автор вопроса
Keep calm и прогай
void MainWindow::MainWindow()
{
    stackedWidget = new QStackedWidget();

    viewWidget = new ViewWidget(); // унаследован от QWidget
    textWidget = new TextWidget();   // унаследован от QWidget
    // ----------------------------
    stackedWidget->addWidget(viewWidget );
    stackedWidget->addWidget(textWidget );
}


TextWidget содержит QTabWidget. При каждом щелчке на квадратик, !!должна!! создается новая вкладка, ( также являющаяся отдельным классом TextArea: QWidget которая и содержит QTextEdit c информацие (id) QGraphicsItem-а)

TextWidget::TextWidget(MainWindow *parent) : p_parent(parent)
{
    tabWidget = new QTabWidget();

    tabWidget->setTabsClosable(true);

    QHBoxLayout *mainLay = new QHBoxLayout(this);
    mainLay->addWidget(tabWidget);
    setLayout(mainLay);
}


ViewWidget::ViewWidget(MainWindow *parent) : p_parent(parent)
{
        scene = new GraphicsScene();
        graphicsView = new GraphicsView(scene);
}


Создание графического элемента:

void GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
    if (event->button() == Qt::LeftButton && m_addNode)
    {
        if(!itemAt(event->scenePos(),QTransform())){
            Node *newNode = new Node();
            addItem(newNode);
        }
    }


QGraphicsItem у меня представлен классом Node. И вот уже в методе mousePressEvent класса Node должен делаться emit SOME_SIGNAL. Вопрос в том, что Node:QGraphicsItem ничего не знает о существовании TextWidget с его вкладками TextArea. Соединяются же объекты и их сигналы и слоты! Но TextWidget и TextArea создаются "на верхнем уровне " , а Node:QGraphicsItem уже дальше. Здесь я немного запутался и не до конца понимаю как реализовать этот механизм((
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы