E rieccomi, scusatemi se rompo un po', ma voglio capire alcune cose.
Allora, ho approfondito un po' il discorso e mi sono studiato per bene i layout.
Visto che ora mi è entrato in testa il concetto che con tanti piccoli widget se ne può fare uno più complesso raggruppandoli, ho pensato di fare in modo che la finestra che voglio creare diventi un unico widget che poi vado ad inserire in MainWindow::CentralWidget e su consiglio di Andrea ho ereditato la mia classe da QWidget (visto che dovrà diventare un widget).
Quindi leggendo un po' di qua, un po' di la e dormendoci sopra una notte sono riuscito a fare tutto.
Unico problema è che non riesco a connettere un segnale ad uno slot del mio widget, perchè a runtime ricevo questo errore:
QObject::connect: No such slot QWidget::b1Pressed().
Il problema ce l'ho solo con il
connect all'interno della classe
inputWindow, perchè quello in
MainWindow funziona bene.
Volevo connettere un pulsante allo slot b1Pressed per capire poi come tornare indietro alla videata precedente, ma mi sono bloccato qui e non sono riuscito a capire anche dalle varie letture e ricerche che ho fatto dov'è l'errore.
Di seguito il codice che ho scritto (è scritto da cani perchè è come il widget che ho costruito, una grande prova con dentro un guazzabuglio di piccole prove )
mainwindow.cpp (mainwindows.h non lo metto perchè non ha praticamente nulla se non la definizione dello slot e le solite cose)
#include "mainwindow.h"
#include "inputwindow.h"
#include <QHBoxLayout>
#include <QPushButton>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
this->setGeometry(200,0,1024,768);
pb = new QPushButton("Apri", this);
QObject::connect(pb, SIGNAL(released()), this, SLOT (input()));
}
MainWindow::~MainWindow() {}
void MainWindow::input()
{
qDebug() << "input";
pb->setVisible(false);
InputWindow *p = new InputWindow(this);
this->setCentralWidget(p);
}
inputwindow.h
#ifndef INPUTWINDOW_H
#define INPUTWINDOW_H
#include <QVBoxLayout>
#include <QWidget>
#include <QTableWidgetItem>
#include <QCheckBox>
#include <QComboBox>
class InputWindow : public QWidget
{
public:
InputWindow(QWidget *parent);
private slots:
void b1Pressed();
};
class STable : public QWidget
{
public:
STable(QWidget *parent = nullptr);
private:
QTableWidgetItem *RightAlignedItem(QString value);
QTableWidgetItem *CenterAlignedItem(QString value);
QCheckBox *SetLineWritable(void);
QComboBox *SetComboBox(void);
};
#endif // INPUTWINDOW_H
inputwindow.cpp
#include "mainwindow.h"
#include "inputwindow.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QTabWidget>
#include <QPushButton>
#include <QDebug>
InputWindow::InputWindow(QWidget *parent) : QWidget(parent)
{
QVBoxLayout *vb = new QVBoxLayout(this);
QHBoxLayout *hb1 = new QHBoxLayout;
QPushButton *b1 = new QPushButton("Chiudi");
QObject::connect(b1, SIGNAL(released()), this, SLOT(b1Pressed()));
QPushButton *b2 = new QPushButton("B2");
QPushButton *b3 = new QPushButton("B3");
hb1->addWidget(b1);
hb1->addWidget(b2);
hb1->addWidget(b3);
vb->addLayout(hb1);
QHBoxLayout *hb2 = new QHBoxLayout;
QTabWidget *tab = new QTabWidget(this);
tab->addTab(new STable, "Prova1");
tab->addTab(new STable, "Prova2");
hb2->addWidget(tab);
vb->addLayout(hb2);
QHBoxLayout *hb3 = new QHBoxLayout;
QPushButton *bbb1 = new QPushButton("BBB1");
QPushButton *bbb2 = new QPushButton("BBB2");
QPushButton *bbb3 = new QPushButton("BBB3");
QPushButton *bbb4 = new QPushButton("BBB4");
QPushButton *bbb5 = new QPushButton("BBB5");
QPushButton *bbb6 = new QPushButton("BBB6");
QPushButton *bbb7 = new QPushButton("BBB7");
QPushButton *bbb8 = new QPushButton("BBB8");
hb3->addWidget(bbb1);
hb3->addWidget(bbb2);
hb3->addWidget(bbb3);
hb3->addWidget(bbb4);
hb3->addWidget(bbb5);
hb3->addWidget(bbb6);
hb3->addWidget(bbb7);
hb3->addWidget(bbb8);
vb->addLayout(hb3);
qDebug() << "Passo di qua";
}
void InputWindow::b1Pressed()
{
qDebug() << "b1Pressed";
}
STable::STable(QWidget *parent) : QWidget(parent)
{
QTableWidget *tbl = new QTableWidget(100,7);
tbl->setHorizontalHeaderLabels(QStringList()<<"Descrizione"<<"aaa"<<"bbb"<<"ccc"<<"ddd"<<"eee"<<"fff");
tbl->setColumnWidth(0, 460);
tbl->setColumnWidth(1, 60);
tbl->setColumnWidth(2, 140);
tbl->setColumnWidth(3, 90);
tbl->setColumnWidth(4, 90);
tbl->setColumnWidth(5, 90);
tbl->setColumnWidth(6, 20);
// tbl->horizontalHeader()->setSectionResizeMode(6, QHeaderView::Fixed); //Fisso la larghezza della colonna 6
for(int i = 0; i < tbl->rowCount(); i++)
{
tbl->setRowHeight(i, 10);
tbl->setItem(i, 1, RightAlignedItem("0"));
tbl->setCellWidget(i, 2, SetComboBox());
tbl->setItem(i, 3, RightAlignedItem("0"));
tbl->setItem(i, 4, RightAlignedItem("0"));
tbl->setItem(i, 5, RightAlignedItem("0"));
tbl->setCellWidget(i, 6, SetLineWritable());
}
QVBoxLayout *Layout = new QVBoxLayout;
Layout->addWidget(tbl);
setLayout(Layout);
}
// ******************
QTableWidgetItem *STable::RightAlignedItem(QString value)
{
auto item = new QTableWidgetItem(value);
item->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter);
return item;
}
QTableWidgetItem *STable::CenterAlignedItem(QString value)
{
auto item = new QTableWidgetItem(value);
item->setTextAlignment(Qt::AlignCenter|Qt::AlignVCenter);
return item;
}
QCheckBox *STable::SetLineWritable(void)
{
QCheckBox *checkBoxItem = new QCheckBox;
checkBoxItem->setCheckState(Qt::Unchecked);
checkBoxItem->setStyleSheet("margin-left:5px; margin-right:5px;");
return checkBoxItem;
}
QComboBox *STable::SetComboBox(void)
{
QComboBox *comboBox = new QComboBox;
comboBox->addItem("1");
comboBox->addItem("2");
comboBox->addItem("3");
comboBox->addItem("4");
comboBox->addItem("5");
comboBox->addItem("6");
comboBox->addItem("7");
return comboBox;
}
A questo punto faccio già una serie di domane per evitare di dovervi stressare ancora:
1. Secondo voi dove sto sbagliando con il comando "connect"?
2. Il codice che ho scritto è corretto così o ci sarebbero modi migliori per scriverlo?
3. Per tornare alla videata principale (dove c'è il pulsante "apri"), devo prima fare un setVisible(false) del widget e poi distruggerlo? E' la cosa più corretta da fare? Non mi è ben chiaro come rimuovere in widget più che altro dalla view.
Grazie anche per la pazienza
Stefano