Centrare una finestra in Qt 6
In questo articolo avevamo visto come centrare una finestra, QMainWindow, in Qt.
Ma parlavamo della versione 5; nella 6 QDesktopWidget è deprecato e quindi quel codice non funziona.
In questo articolo avevamo visto come centrare una finestra, QMainWindow, in Qt.
Ma parlavamo della versione 5; nella 6 QDesktopWidget è deprecato e quindi quel codice non funziona.
Ho deciso di creare un programma in Qt senza usare l'interfaccia grafica; e quindi scrivendo tutto il codice.
La mia finestra deve avere queste caratteristiche:
Ovviamente voi potete "levare" quello che non vi serve.
Quando lanciamo la finestra principale da QtCreator, la QMainWindow risulta centrata rispetto al desktop.
Poi avviamo il programma senza passare per QtCreator, e la finestra è decentrata.
Ho provato a vedere nel relativo file .ui, ma non ho trovato nulla al riguardo.
Quando si sviluppa con le Qt si incappa spesso in problemi incompatibilità tra le classi native del C++ e del framework.
Nel caso specifico mi sono trovato a dover fare la conversione da QString a string e viceversa.
Questo perchè ho una classe che svolge determinate operazioni al di fuori del fremwork e che ha una risultato raccolto dalla gui.
Nello specifico la classe è questa:
#include "scan.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
using std::string;
Scan::Scan()
{
}
string Scan::scanNetwork(string cmd)
{
char *buf = &cmd[0];
FILE *p = popen(buf, "r");
string s;
for (size_t count; (count = fread(buf, 1, sizeof(buf), p));)
{
s += string(buf, buf + count);
}
pclose(p);
return s;
}
La classe prende come input quanto scritto in una QTextEdit e il risultato viene visualizzato in un'altra QTextEdit.
Solo che personalmente nella classe preferisco usare le librerie standard del C++, mentre nella QMainWindow usare le classi Qt.
Vediamo quindi come fare i due passaggi.
Ho cominciato lo sviluppo di un programmino in C++ e le Qt.
Con Qt-Creator, l'IDE ufficiale per lo sviluppo cone le Qt, ho creato un progetto Qt Widget Project -> Qt Gui Application.
Mi sono ritrovato con una QWindow e dall'editor grafico ho aggiungo due QAction al menu.
A questo punto il problema era: come fare a collegare un'azione/evento alla voce del menu (QAction)?
Bene, vediamo come fare.
I file che ci interessano sono mainwindow.h e mainwindow.cpp.
In pratica dobbiamo aggiungere una funzione che poi collegheremo alla QAction.
Inizialmente i file erano questi:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "ui_mainwindow.h"
#include "mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
I file predefiniti dopo la creazione del progetto.
A questo punto dobbiamo creare una funzione che venga eseguita al click sulla voce del menu (o all'esecuzione della scorciatoia da tastiera che è possibile impostare anche dall'editor grafico).