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()));
}
У вас слот не подключается в конструкторе 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()));
}
Подробней про новый способ подлючения слотов (англ.)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости