Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale
Nelle ultime settimane abbiamo provato la Corsair Vanguard Air 99 Wireless, una tastiera tecnicamente da gaming, ma che in realtà offre un ampio ventaglio di possibilità anche al di fuori delle sessioni di gioco. Flessibilità e funzionalità sono le parole d'ordine di una periferica che si rivolge a chi cerca un prodotto capace di adattarsi a ogni esigenza e ogni piattaforma
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio
DEEBOT T90 PRO OMNI abbina un sistema di aspirazione basato su tecnologia BLAST ad un rullo di lavaggio dei pavimenti dalla larghezza elevata, capace di trattare al meglio le superfici di casa minimizzando i tempi di lavoro. Un robot completo che riesce anche ad essere sottile e garantire automazione ed efficienza nelle operazioni di pulizia di casa
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 15-11-2016, 18:09   #1
stefanoxjx
Senior Member
 
L'Avatar di stefanoxjx
 
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
[C++ & QT]Sto imparando e vorrei qualche consiglio...

Ciao a tutti, sto imparando contemporaneamente a programmare in C++ e ad usare le Qt.
Ho letto un po' di libri ed ora sto cercando di cimentarmi sviluppando un programma che è già a buon punto, ma ovviamente mi sono lasciato dei dubbi alle spalle che se possibile vorrei chiarire con voi.

Punto 1: Il programma che sto sviluppando ha vari files .h e .cpp.
In questi files uso delle costanti che sono comuni a tutti e per non riscriverle tutte ogni volta su ogni file (altrimenti non vengono viste) ho creato un file header con nome costanti.h che vado ad includere su ogni file.
Volevo capire se questo è il modo più giusto per avere visibilità globale delle costanti o se ci sono altri modi.

Punto 2: Il programma ha una finestra principale e una finestra Opzioni.
Non sono riuscito a capire come potrei fare ad intercettare dalla finestra principale l'uscita dalla finestra "Opzioni" per richiamare un metodo che faccia degli aggiornamenti sulla finestra principale.
Mi spiego meglio, quando selezioni "Opzioni" mi si apre una nuova finestra con delle opzioni che io posso cambiare oppure no.
Vorrei che quando confermo le "Opzioni" con OK, mi si chiuda la finestra opzioni (come succede ora) ma la finestra principale sapendo di aver ripreso il controllo richiami un metodo per rileggere le impostazioni ed aggiornarsi.
Pensavo ad un segnale inerente al Focus ma su QMainWindow non trovo segnali simili.

Punto 3: Ho collegato un segnale ad uno slot con il seguente comando:
Codice:
connect(&cmbTarget, SIGNAL(currentIndexChanged(int)), this, SLOT(on_cmbTarget_currentIndexChanged(int)));
e il programma funziona senza problemi, però mi segnala questo:
Codice:
QMetaObject::connectSlotsByName: No matching signal for on_cmbTarget_currentIndexChanged(int)
Ho fatto delle ricerche in merito e da quello che ho capito è perchè all'inizio avevo definito lo slot con nome diverso dal segnale.
Allora ho modificato il nome dello slot ed effettivamente il messaggio era inizialmente sparito.
Ora a volte c'è e altre no e non riesco a capire il perchè.

Punto 4: Avendo una serie di widget TextLine da completare tramite settings.value, esiste un metodo tipo foreach o simili per non maneggiarli uno ad uno?
Questo è il codice che ho scritto
Codice:
    ui->lineEditName1->setText(settings.value(sKeyName1).toString());
    ui->lineEditName2->setText(settings.value(sKeyName2).toString());
    ui->lineEditName3->setText(settings.value(sKeyName3).toString());
    ui->lineEditName4->setText(settings.value(sKeyName4).toString());
    ui->lineEditName5->setText(settings.value(sKeyName5).toString());
    ui->lineEditName6->setText(settings.value(sKeyName6).toString());
    ui->lineEditTel1->setText(settings.value(sKeyTel1).toString());
    ui->lineEditTel2->setText(settings.value(sKeyTel2).toString());
    ui->lineEditTel3->setText(settings.value(sKeyTel3).toString());
    ui->lineEditTel4->setText(settings.value(sKeyTel4).toString());
    ui->lineEditTel5->setText(settings.value(sKeyTel5).toString());
    ui->lineEditTel6->setText(settings.value(sKeyTel6).toString());
ma magari con un foreach o simili me la cavo con 3 righe.

Spero che qualcuno mi possa aiutare a chiarirmi le idee.
Grazie.

Stefano
stefanoxjx è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2016, 10:45   #2
stefanoxjx
Senior Member
 
L'Avatar di stefanoxjx
 
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
Le costanti sono variabili const.
Mi spieghi cosa intendi con:

Quote:
se sono variabili const vanno dichiarate nell'header ma definite in un cpp che sara' compilato insieme al resto del programma.
Grazie.

Stefano
stefanoxjx è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2016, 17:38   #3
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Punto 1:
Dipende dal tipo della costanti che hai. Ad esempio se sono int puoi scrivere:
Codice:
//Constants.h
#pragma once

class Constants
{
	const int a = 5;
};
Se però hai anche stringhe devi usare un file .cpp per l'inizializzazione

Punto 2:
Se non ho capito male dovresti ridefinire il closeEvent della tua finestra e aggiungere un signal alla classe in modo da poterlo intercettare dalla finestra di tuo interesse.
Esempio:
Codice:
//file dialog.h:
void closeEvent(QCloseEvent *event);
signals:
void dialogClosed();

//file dialog.cpp
Dialog::closeEvent(QCloseEvent *event)
{
emit dialogClosed();
event->accept();
}
Punto 3:
Sei sicuro di aver identificato correttamente signal e slot nella definizione delle classi? Dall'errore sembra che tu non abbia definito on_cmbTarget_currentIndexChanged come slot.
Comunque usa la sintassi C++11 e non avrai più errore anche se non hai definito uno slot, altrimenti otterrai un errore in fase di compilazione se stai sbagliando la definizione:
Codice:
connect(&cmbTarget, &cmbTargetClassType::currentIndexChanged,
 this, &thisClassType::on_cmbTarget_currentIndexChanged);
La sintassi C++11 funziona con tutti i metodi non solo con gli slot.

Punto 4:
se assegni un nome sequenziale ad ogni controllo, lo puoi fare facilmente in un ciclo for partendo dal controllo parent che contiene i controlli cercati:
Codice:
for (int i = 1; i <= maxLineEdit; i++)
    QLineEdit *lineEdit= parentWidget->findChild<QLineEdit *>("lineEditName"+QString::number(i));

Ultima modifica di tomminno : 16-11-2016 alle 17:43.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 16-11-2016, 21:59   #4
stefanoxjx
Senior Member
 
L'Avatar di stefanoxjx
 
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
Ciao e grazie della risposta.
Allora, andando per passi:

Punto 1:
Queste sono le costanti che ho messo nell'header:
Codice:
#ifndef COSTANTI_H
#define COSTANTI_H

#include <QString>

const QString sKeyComPort="ComPort";
const QString sKeyBaud="Baud";
const QString sKeyDiffTime="DiffTime";
const QString sKeyName1="Name1";
const QString sKeyName2="Name2";
const QString sKeyName3="Name3";
const QString sKeyName4="Name4";
const QString sKeyName5="Name5";
const QString sKeyName6="Name6";
const QString sKeyTel1="Tel1";
const QString sKeyTel2="Tel2";
const QString sKeyTel3="Tel3";
const QString sKeyTel4="Tel4";
const QString sKeyTel5="Tel5";
const QString sKeyTel6="Tel6";
const QString sKeyLastName="LastName";

#endif // COSTANTI_H
Punto 2:
Su consiglio di un utente di un altro forum, ho sostituito la chiamata della finestra opzioni da .show() a .exec() e così ho risolto il problema.
Essendo novellino di Qt non ci avevo proprio pensato.

Punto 3:
Ieri sera mi sono messo a cercare una soluzione ed ho scoperto che quando si crea un dialogo tramite il designer, nel file MOC vengono creati già di default tutti gli eventi possibili dei vari widget che iniziano con on_ e questo crea dei conflitti se vengono definiti manualmente altri eventi uguali con lo stesso nome.
Mi è quindi bastato rinominare il mio evento togliendo l'on_ iniziale e il problema si è risolto.

Punto 4:
Tra i vari libri che ho letto mi sembrava di aver visto anche la possibilità di passare in rassegna i widget tramite un ciclo for, però non ricordavo dove.
Domani se ho un po' di tempo mi metto a fare qualche esperimento

Grazie.

Stefano
stefanoxjx è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2016, 19:47   #5
stefanoxjx
Senior Member
 
L'Avatar di stefanoxjx
 
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
questo non linka se includi constanti.h da più di un file sorgente.
Eppure sembra funzionare.
Quindi, lasciando perdere che comunque sembra funzionare quale sarebbe la soluzione migliore da utilizzare?

Grazie.

Stefano
stefanoxjx è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2016, 19:37   #6
stefanoxjx
Senior Member
 
L'Avatar di stefanoxjx
 
Iscritto dal: Jul 2002
Città: Padova
Messaggi: 4245
Scusate il ritardo nella risposta, ma sono stato preso da altro.
Vi ringrazio per le risposte esaustive che ho già fatto fruttare
Grazie ancora.

Stefano
stefanoxjx è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2016, 19:48   #7
71106
Bannato
 
Iscritto dal: Nov 2014
Messaggi: 292
Quote:
Originariamente inviato da Antonio23 Guarda i messaggi
dichiarazioni nel file .h e definizioni nel file .cpp
Vale per le funzioni, ma per le variabili bisogna anche usare extern.
71106 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Corsair Vanguard Air 99 Wireless: non si era mai vista una tastiera gaming così professionale Corsair Vanguard Air 99 Wireless: non si era mai...
Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lavaggio è ampio Ecovacs DEEBOT T90 PRO OMNI: ora il rullo di lav...
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
Nintendo aggiorna Switch 2 con Handheld ...
Componenti PC in offerta su Amazon: GPU,...
Ecobonus moto elettriche 2026: fino a 4....
Le nuove offerte Amazon, con aggiornamen...
5 motivi per comprare oggi Motorola Edge...
I produttori di memorie non vogliono inv...
VMware Hosted Private Cloud, il cloud pr...
Le cuffie per giocatori JBL Quantum 910X...
Xiaomi Watch S3 a prezzo dimezzato: 15 g...
Nothing Phone (2a) a poco più di ...
OnePlus prepara due nuovi tablet Android...
ASUS Zenbook supera MacBook Air in tutto...
Amazfit Active 2 a 71,49€ protagonista d...
Tutti gli iPhone avranno display ProMoti...
DLSS 5 irriso sul web, secondo il CEO di...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 11:42.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v