|
Programmazione & Co.
|
|
Lunedì 26 Dicembre 2011 18:53 |
|
Con questo articolo prendo due piccioni con una fava; vedremo sia come usare un QFileDialog per decidere dove salvare i file, sia come salvarli fisicamente usando il puro C++.
Dire di cominciare dalla parte grafica Qt.
Come componente grafico di input ho usato una QAction in modo da mettere nel menu File la classica voce Salva.
Poi ho creato una funzione dentro alla MainWindow e collegato le due (per vedere nel dettagli come si fa guardate qua):
connect(ui->actionSave, SIGNAL(triggered()), this, SLOT(saveFile()));
...........
void MainWindow::saveFile()
{
QString filename = QFileDialog::getSaveFileName(this, tr("Save"), QDir::homePath(), tr("TXT(*.txt);;DOC(*.doc)"));
char *cFilename = filename.toAscii().data();
SaveResult save;
save.saveFile(cFilename, ui->txtResult->toPlainText().toStdString());
}
Qua potete vedere la doc ufficiale relativa alla funzione getSaveFileName().
Il primo parametro indica la finestra parent.
|
|
Ultimo aggiornamento Lunedì 26 Dicembre 2011 19:14 |
|
|
Programmazione & Co.
|
|
Domenica 18 Dicembre 2011 12:57 |
|
Per chi si affaccia alla programmazione, o per chi viene da linguaggi più semplici, a volte il funzionamento della funzione printf() del C++ rimane un pò oscura all'inizio.
Preciso comunque che printf() è presenta anche in altri linguaggi com il C o il PHP.
Ma non conosco il C e in PHP la uso poco, quindi non so se ci sono differenze.
Per quanto il C++ questo è un banale esempio:
int a = 10;
printf("Il numero è: %d", a);
Cos'è quel %d?
Banalmente si può dire che è un segna posto.
In pratica printf è in grado stampare qualsiasi contenuto, che sia numerico, carattere, ecc.
|
|
Ultimo aggiornamento Lunedì 19 Dicembre 2011 01:11 |
|
Programmazione & Co.
|
|
Mercoledì 14 Dicembre 2011 10:59 |
|
Abituato a Swing ci sono rimasto un pò male nel vedere che QWidget a dimensione fissa non ha una funzione per impostare che la finestra non sia ridimensionabile.
Ovviamente con un piccolo sotterfugio si può ovviare al problema.
Basta impostare la dimensione, la minimumSize e la maximumSize alla stessa dimensione.
Quindi se si usa l'editor grafico possiamo modificare le relative proprietà, o modificare il file .ui in formato XML:
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>703</width>
<height>700</height>
</rect>
</property>
<property name="minimumSize">
<size>
<width>703</width>
<height>700</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>703</width>
<height>700</height>
</size>
</property>
.....
Se invece vogliamo fare tutto da codice possiamo fare una cosa del genere:
|
|
Ultimo aggiornamento Mercoledì 14 Dicembre 2011 11:12 |
|
Programmazione & Co.
|
|
Lunedì 12 Dicembre 2011 23:14 |
|
Eseguire comandi di sistema in C++ non è molto complicato.
Per farlo possiamo usare la funzione system().
Eccovi un semplice esempio su Linux:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("Eseguo comando ls");
system("ls -l");
exit(0);
}
Il problema di questa funzione è che anche se stampa il risultato del comando, comunque ritorna un int.
Quindi se ad esempio vogliamo stampare il risultato in un componente grafico tipo un QPlainTextEdit (che richiede quantomeno un oggetto string e non un int) come possiamo fare?
Ci sono diverse soluzioni; io ho usato la funzione popen().
Nel caso specifico ho una piccola classe con una funzione che esegue il comando nmap con i vari parametri.
|
|
Ultimo aggiornamento Lunedì 12 Dicembre 2011 23:39 |
|
Programmazione & Co.
|
|
Sabato 10 Dicembre 2011 15:29 |
|
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.
|
|
Ultimo aggiornamento Lunedì 12 Dicembre 2011 23:15 |
|
Programmazione & Co.
|
|
Mercoledì 07 Dicembre 2011 12:07 |
|
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).
|
|
Ultimo aggiornamento Mercoledì 07 Dicembre 2011 13:49 |
|
Programmazione & Co.
|
|
Martedì 30 Agosto 2011 12:13 |
|
Mi sono dato allo studio del C++ e vi posto il mio primo articolo al riguardo.
L'argomento, come da titolo, riguarda le parole riservate e che quindi no possono essere usate per altri scopi.
Vi posto due tabelle: la prima riguarda le parole riservate anche al C; la seconda solo al C++.
|
|
Ultimo aggiornamento Domenica 23 Ottobre 2011 10:37 |
|
|
|
|
|