Как вызвать одно окно из слота другого Qt

188
10 апреля 2019, 01:50

q2 главное стартовое окно. У него есть кнопка QButton pushButton. При нажатии на неё должно появляться другое окно из класса online с выводом списка, который передается параметром в конструкторе q2. Видел примеры кода в интернете, делал так же, но почему-то по нажатию ничего не происходит

main.cpp

    #include "q2.h"
#include "online.h"
#include <QtWidgets/QApplication>
#include <string>
#include <stack>
using namespace std;
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    stack <string> s;
    s.push("Roman");
    s.push("Marina");
    q2 w(s);
    w.show();
    return a.exec();
}

q2.h

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_q2.h"
#include "ui_online.h"
#include "online.h"
#include <string>
class q2 : public QMainWindow
{
    Q_OBJECT
public:
    q2(QWidget *parent = Q_NULLPTR);
    q2(stack <string> s);
public slots:
    void CreateOnline(stack <string> sta)
    {
        online* one = new online;
        one->online::showOnline(sta);
        one->QWidget::show();
    }
private:
    Ui::q2Class ui;
};

online.h

#include <QWidget>
#include <QStandardItemModel>
#include "ui_online.h"
#include <string>
#include <stack>
#include <QListView>
using namespace std;
class online : public QWidget
{
    Q_OBJECT
public:
    online(QWidget *parent = Q_NULLPTR);
    void showOnline(stack <string> s);
private:
    Ui::online ui;
};

online.cpp

online::online(QWidget *parent) : QWidget(parent)
{
    ui.setupUi(this);
}
void online::showOnline(stack <string> s)
{
    QStandardItemModel *model = new QStandardItemModel;
    QStandardItem *item;
    while (!s.empty())
    {
        string g = s.top();
        s.pop();
        QString qstr = QString::fromStdString(g);
        item = new QStandardItem(qstr);
        model->appendRow(item);
    }
    ui.listView->setModel(model);
}

q2.cpp

q2::q2(QWidget *parent): QMainWindow(parent)
{
    ui.setupUi(this);
    QObject::connect(ui.pushButton, SIGNAL(clicked()), qApp, SLOT(close()));
}
q2::q2(stack <string> s)
{
    ui.setupUi(this);
    QObject::connect(ui.pushButton, SIGNAL(clicked()), qApp, SLOT(CreateOnline(s)));
    QObject::connect(ui.out, SIGNAL(clicked()), this, SLOT(close()));
}
Answer 1

У вас слот не подключается в конструкторе q2::q2(stack<string>). Так как во-первых вы пытаететесь подключаться к qApp, а у него такого слота нет. Во-вторых connect не поддерживает ни параметры по умолчанию, ни передачу их из вне, то есть SLOT(CreateOnline(s)) вообще ни к месту и как оно скомпилировалось не понятно:

q2::q2(stack <string> s)
{
    ui.setupUi(this);
    QObject::connect
    (
          ui.pushButton
        , SIGNAL(clicked())
        , qApp                   // видимо имелось в виду this
        , SLOT(CreateOnline(s))  // здесь s не передастся
    );
    QObject::connect(ui.out, SIGNAL(clicked()), this, SLOT(close()));
}

Исправить можно с помощью подключения лямбды например:

q2::q2(stack <string> s)
{
    ui.setupUi(this);
    QObject::connect
    (
          ui.pushButton
        , &QPushButton::clicked
        , [this, s]() -> void // лямбда захватывает s
          {
              this->CreateOnline(s);
          }
    );
    QObject::connect(ui.out, SIGNAL(clicked()), this, SLOT(close()));
}

Подробней про новый способ подлючения слотов (англ.)

READ ALSO
Почему выводит 1?

Почему выводит 1?

Почему выводит 1?

167
Посчитать количество чётных чисел [закрыт]

Посчитать количество чётных чисел [закрыт]

Как сделать так, чтобы после вывода 20 рандомных чисел пиcалось есть чётные числа или нет?

181
Нужна помощь с выводом матрицы

Нужна помощь с выводом матрицы

Написал функцию создания матрицы и подсчета её определителя, но не могу написать функцию вывода матрицыВместо всех строк и столбцов вывод...

180
Ошибка &ldquo;undefined reference to `TreeNode::tree&#39;&rdquo; [дубликат]

Ошибка “undefined reference to `TreeNode::tree'” [дубликат]

На данный вопрос уже ответили:

159