Tichu Counter for Symbian
-
Πρώτο μου post, πριν λίγο καιρό έμαθα το πως να χρησιμοποιώ C/C++ και έπεσα κατευθείαν στα βαθιά. Αυτό που προσπαθώ να κάνω είναι όπως λέω και στον τίτλο έναν μετρητή πόντων για το παιχνίδι Tichu. Ομολογώ να πω πως έψαξα πολύ κάποια πράγματα, κατάφερα κάποια μόνος μου αλλά σε ένα σημείο έχω κολλήσει και δεν μπορώ να βρω το πως να το καταφέρω. Αρχικά σας δείχνω μία εικόνα από το Design της εφαρμογής !http://s3.postimage.org/6gxryqrpv/image.jpg()! Και ακόμη μία για το πως αυτό φαίνετε στο κινητό . !http://s8.postimage.org/tm1zgntk5/image.jpg()! . Τώρα, όπως μπορείτε να δείτε υπάρχουν 2 κουμπιά Count και 2 Spinboxes αντίστοιχα. Αυτό που ψάχνω να βρω πως γίνετε είναι το να παίρνω την τιμή από τα Spinboxes με το κάθε κουμπί Count αντίστοιχα και να την εμφανίζω σε κάθε μία από τις 2 κεντρικές οθονούλες ακριβώς από πάνω. Αφού την εμφανίζει πάνω, θέλω όταν πατηθεί ξανά το Count να προσθέτει την τωρινή με την προηγούμενη τιμή. Έχω φάει τον τόπο και δεν μπορώ να καταλάβω τι γίνετε οπότε κάθε βοήθεια θα ήταν χρήσιμη... Ευχαριστώ εκ των προτέρων.
-
Αρχικά ευχαριστώ πολύ για την αποδοχή στο Group, καλώς σας βρήκα. Δεύτερον, για να κάνω αυτό που περιγράφω πάνω, μετά από πολύ κόπο και πολύ ψάξιμο, έκανα ένα νέο προγραμματάκι το οποιο περιέχει μόνο το Spinbox, ένα label και ένα κουμπί OK (σχετική εικόνα : !http://s3.postimage.org/my1zau9kj/image.jpg()! Αυτό που θέλω να πετύχω σε αυτό το στάδιο είναι να εμφανίζει με το ΟΚ την τιμή του Spinbox στο Label. Και αυτή τη φορά επεξεργάστηκα τους κώδικες τους οποίους και θα σας παραθέσω γιατί μου βγάζει error Ότι δεν υπάρχει η Slot στην εντολή QObject::connect
mypage.h
@#ifndef MYPAGE_H
#define MYPAGE_H#include <QWidget>
#include <QPushButton>
#include <QLabel>
#include <QSpinBox>class QLabel;
class QSpinBox;
class QPushButton;namespace Ui {
class Mypage;
}class Mypage : public QWidget
{
Q_OBJECT
public:
explicit Mypage(QWidget *parent = 0);
~Mypage();
private slots:
void pushButtonClicked();private:
Ui::Mypage *ui;
QLabel *label;
QSpinBox *numberBox;
QPushButton *pushButton;
};#endif // MYPAGE_H
@mypage.cpp
@#include "mypage.h"
#include "ui_mypage.h"
#include <QtGui>
#include <QPushButton>
#include <QLabel>
#include <QSpinBox>Mypage::Mypage(QWidget *parent) :
QWidget(parent),
ui(new Ui::Mypage)
{numberBox = new QSpinBox; numberBox->setRange(0, 1000); QLabel *label= new QLabel; QPushButton *pushButton = new QPushButton; ui->setupUi(this);
// ΕΔΩ ΕΙΝΑΙ ΤΟ ΣΗΜΕΙΟ ΠΟΥ ΜΟΥ ΒΓΑΖΕΙ ΣΤΟ Compilation Ότι δεν υπάρχει η Slot
QObject::connect(pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
}
Mypage::~Mypage()
{
delete ui;
}void Mypage::pushButtonClicked()
{
label -> setNum(numberBox->value());
}
@Αν καταφέρω και λύσω αυτό το πραγματάκι τότε θα μπορέσω να δημιουργήσω το πρόγραμμα, γι' αυτό σας παρακαλώ αν θα μπορούσατε να βοηθήσετε θα σας ήμουν ευγνώμων
-
Έφτιαξα ενα μικρο project που κανει αυτο που θελεις, αλλα το εφτιαξα με τον QtCreator και με επιλογή
Qt Gui Application (που ειναι η μονη που χρησιμοποιω προς το παρον).
Ο κώδικας είναι ο εξής:tichucounter.h :
@#ifndef TICHUCOUNTER_H
#define TICHUCOUNTER_H#include <QMainWindow>
namespace Ui {
class TichuCounter;
}class TichuCounter : public QMainWindow
{
Q_OBJECTpublic:
explicit TichuCounter(QWidget *parent = 0);
~TichuCounter();private:
Ui::TichuCounter *ui;
private slots:
void pushButtonClicked();
};#endif // TICHUCOUNTER_H@
main.cpp:
@#include <QtGui/QApplication>
#include "tichucounter.h"int main(int argc, char *argv[])
{
QApplication a(argc, argv);
TichuCounter w;
w.show();return a.exec();
}
@tichucounter.cpp:
@#include "tichucounter.h"
#include "ui_tichucounter.h"TichuCounter::TichuCounter(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::TichuCounter)
{
ui->setupUi(this);ui->spinBox->setRange(0,1000); connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(pushButtonClicked()));
}
TichuCounter::~TichuCounter()
{
delete ui;
}void TichuCounter::pushButtonClicked()
{
ui->label->setNum(ui->spinBox->value());
}@εχει και το tichucounter.ui που το εφτιαξα στο design του Qt.
Σου κανει αυτό?
ΥΓ: τώρα ειδα την ημερομηνια... υποθετω πως εχεις ηδη λύσει το προβλημα...
(Η διαφορά με τον δικο σου κωδικα, ειναι κυριως στο πως καλεις το connect και τα Objects). -
Ευχαριστώ πάρα μα πάρα πολύ για την απάντηση. Η αλήθεια είναι πως το συγκεκριμένο πρόβλημα το έχω λύσει. Η εφαρμογή είναι σχεδόν έτοιμη, θα έλεγα γύρω στο 80 % . Δοκίμασα τα Spinboxes και δεν μ' άρεσε το πως δουλεύει οπότε προσπάθησα να αντικαταστήσω τα Spinbox με ένα κουμπί που όταν το πατάς να σε μεταφέρει σε καινούριο παράθυρο στο οποίο να υπάρχει κάτι σαν στυλ "Calculator" στο οποίο ο χρήστης να βάζει τις τιμές. Τώρα για να μην ξαναεξηγώ το πρόβλημα θα σου βάλω το ποστ που έχω κάνει στο "Mobile & Embeded", το εξηγώ πολύ διεξοδικά(2η Σελίδα ο τελευταίος κώδικας που έβαλα). "Mobile and Embedded":http://qt-project.org/forums/viewthread/24982/P15/#120261 . Τα παιδιά από εκεί μου είπαν πως πρέπει να επεξεργαστώ τον Original Κώδικα της QInputDialog για να κάνω το 2ο παράθυρο σαν pop up dialog. Βρήκα τον κώδικα , απομόνωσα αυτό που θέλω αλλά δεν ξέρω τι πρέπει να κάνω και πως να συνεχίσω από αυτό το σημείο. Αν θέλεις να με βοηθήσεις μπορώ να σου γράψω και αυτούς τους κώδικες.
-
Καλημέρα...
Έριξα μια σύντομη ματιά και τα συμπεράσματα μου είναι τα εξής:- Η εφαρμογή σου χρειάζεται απλώς ενα MainWindow και ενα Dialog.
- Παρατήρησα οτι χρησιμοποιεις καπου SLOT με όρισμα (συγκεκριμενα στο MainWindow.h
σειρα 22 @ void Proccess(int a);@
Αυτο θα σου δημιουργήσει καποια προβληματακια:
"Δες εδώ:":http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CD4QFjAB&url=http://www.qtcentre.org/threads/31116-Why-is-not-possible-call-slot-with-parameters&ei=Lw9iUf-oM4b8OYnYgJAJ&usg=AFQjCNEUp6CkooYC-Pw1EFl5oAfqUk2rzQ&sig2=tU1Fhe7dzJzgPxsjPT8L1g&bvm=bv.44770516,d.ZWU&cad=rjaΔεν ειδα ομως παρακατω να τη χρησιμοποιεις σε connect και ισως εχω αδικο.
-
Τα ονόματα των συναρτήσεων σου, φαινονται σαν να εχουν προελθει απο συνδεσεις μεσω του Design. Πρόσφατα, είχα ένα προβληματακι με αυτες τις συνδεσεις και εχω αποφασισει νατις κανω manual για να μπορω να κανω και αποσύνδεση αν χρειαστει. Ειμαι αρχαριος στο Qt και ισως κανω λαθος... αλλα καπου αποθηκευονται αυτες οι συνδεσεις και μετα δε μπορεις να τις χειριστεις.
(Τουλαχιστον εγω, αναγκαστικα και εφτιαξα απο την αρχη όλο το MainWindow εξαιτιας μιας τετοιας συνδεσης που δεν εσβηνε απο πουθενα) -
Νομιζω πως πρεπει να ανοιγεις το δευτερο MainWindow (που μαλλον θα γινει Dialog) με
exec() και οχι με show()... δε θες παραλληλη προσβαση και στα 2... τουλαχιστον ετσι καταλαβα.
και έπειτα, για να γυρισεις στο MainWindow, απλα θα πρεπει να κλείσεις το διαλογο και θα γυρισει μονο του. (Η προταση μου, χωρις να ειμαι σιγουρος, ειναι να γινει ο διαλογος Int και κλεινοντας να επιστρεφει την καταλληλη τιμη αλλα δεν το εχω ψαξει και δεν ξερω ακομα αν και πως γινεται αυτο) -
Αυτο το:
@ key2.on_Done_clicked();@
στη γραμη 42 του MainWindow.cpp τι ειναι?
ΥΓ: Θα μπορουσα να σε βοηθησω περισσοτερο αν ηξερα τι ακριβως θελεις να κανεις
(Απλα ελληνικα... χωρις κωδικα... και μετα τον βλεπουμε και αυτον.)
Δηλαδη:
-Ξεκιναμε απο ενα MainWindow (το οποιο καλει αμεσως ενα διαλογο)
-Ο διαλογος παιρνει μια τιμη και την επιστρεφει στo MainWindow για επεξεργασια
(ή την επεξεργαζεται και αυτος πρωτα?)
-Μετα το MainWindow τι επεξεργασια θελεις να κανει? κλπ -
Kαλημέρα,
ας παρουσιάσω και εδώ το πρόβλημά μου στα ελληνικά μπας και μπορείς είτε εσύ είτε κάποιος άλλος να βοηθήσει.Αρχικά έχω δημιουργήσει 2 MainWindows (Class QWidget και τα 2)
MainWindow1 : !http://s18.postimg.org/53h2p1w0p/Main_Window1.jpg()!
MainWindow2 : !http://s22.postimg.org/oy6xeu7mp/Main_Window2.jpg()!Αυτό που θέλω να γίνεται όταν τρέχει το πρόγραμμα είναι το εξής :
- Ο χρήστης πατάει το "Recount" Button και βγαίνει το παράθυρο MainWindow2
- Βάζει μια τιμή στο "QLineEdit" Widget
- Όταν πατάει το "Done" Button θέλω το πρόγραμμα με κάποιον τρόπο να αποθηκεύει την τιμή και να την στέλνει στο MainWindow1 (Σε αυτό ακριβώς το σημείο υπάρχει το QInputDialog το οποίο όμως είναι standard. Εγώ θέλω να δημιουργήσω ένα δικό μου, βασισμένο στην διαδικασία αυτήν, με το οποίο όμως ο Χρήστης εισάγει τιμές χειροκίνητα στο πρόγραμμα, σύμφωνα με ένα "Calculator - type keyboard" που επίσης μόνος μου έφτιαξα, θα σας βάλω και εικόνα από το Πρόγραμμά μου να δείτε τι εννοώ.)
- Όταν πατηθεί το "Done" Button θέλω να έρχετε πάλι το παράθυρο MainWindow1
- Tέλος, όταν πατηθεί το κουμπί Count θέλω να εμφανίζεται σε κάποιο από τα QLabels η τιμή που εισήγαγε ο χρήστης.
Τώρα, οι ενναλαγές των παραθύρων λειτουργούν κανονικά, απλά δεν λειτουργεί η διαδικασία αυτή, διότι απ' ότι κατάλαβα κάθε φορά που γίνετε εναλλαγή παραθύρων δημιουργούνται συνέχεια Νέα Widgets και έτσι χάνονται οι τιμές.
Αυτό είναι το ScreenShot με το Keyboard (calculator - type) που έφτιαξα στο κυρίως πρόγραμμά μου :
!http://s17.postimg.org/nh2sqs3wv/sadsad.jpg()!Και εδώ είναι ο κώδικας :
MainWindow1.h
@ #ifndef MAINWINDOW1_H
#define MAINWINDOW1_H
#include <QWidget>
#include <QPushButton>
#include<mainwindow2.h>
namespace Ui {
class MainWindow1;
}class MainWindow1 : public QWidget { Q_OBJECT public: explicit MainWindow1(QWidget *parent = 0); ~MainWindow1(); public slots: void openNewWindow(); void on_Count_clicked(); void on_Record_clicked(); void Proccess(int a); private: Ui::MainWindow1 *ui; class MainWindow2 *mMyNewWindow; private slots: }; #endif // MAINWINDOW1_H@
MainWindow2.h
@#ifndef MAINWINDOW2_H
#define MAINWINDOW2_H
#include <QWidget>
#include<mainwindow1.h>
#include <QPushButton>
namespace Ui {
class MainWindow2;
}class MainWindow2 : public QWidget
{
Q_OBJECTpublic:
explicit MainWindow2(QWidget *parent = 0);
~MainWindow2();public slots:
void openOldWindow();
void on_Done_clicked();
int GetNumber();private:
Ui::MainWindow2 *ui;
class MainWindow1 *mMyOldWindow;private slots:
};@MainWindow1.cpp
@ #include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "mainwindow2.h"
#include <QWidget>
#include <QPushButton>MainWindow1::MainWindow1(QWidget *parent) : QWidget(parent), ui(new Ui::MainWindow1) { ui->setupUi(this); QObject::connect(ui->Record, SIGNAL( clicked() ), this, SLOT(on_Record_clicked())); QObject::connect(ui->Count, SIGNAL( clicked() ), this, SLOT(on_Count_clicked())); } MainWindow1::~MainWindow1() { delete ui; } void MainWindow1::openNewWindow() { mMyNewWindow = new MainWindow2(); mMyNewWindow->show(); } void MainWindow1::on_Record_clicked() { openNewWindow(); } void MainWindow1::Proccess(int a) { ui->Test->setNum(a); } void MainWindow1::on_Count_clicked() { int number; MainWindow2 key2; key2.on_Done_clicked(); }
@
*
MainWindow2.cpp*
@ #include "mainwindow2.h"
#include "ui_mainwindow2.h"
#include <QWidget>
#include <QPushButton>
#include <QString>
MainWindow2::MainWindow2(QWidget *parent) :QWidget(parent), ui(new Ui::MainWindow2) { int p; ui->setupUi(this); p = GetNumber(); MainWindow1 key; key.Proccess(p); QObject::connect(ui->Done, SIGNAL( clicked() ), this, SLOT(on_Done_clicked())); } MainWindow2::~MainWindow2() { delete ui; } int MainWindow2::GetNumber() { QString mystring1(ui->Score1->text()); int c = mystring1.toInt(); ui->label->setNum(c); return c; } void MainWindow2::on_Done_clicked() { int k; k = GetNumber(); MainWindow1 key1; key1.Proccess(k); openOldWindow(); } void MainWindow2::openOldWindow() { mMyOldWindow = new MainWindow1(); mMyOldWindow->show(); }
@
-
Τώρα koleygr , απαντώντας στις ερωτήσεις σου :
1) Η εφαρμογή σου χρειάζεται απλώς ενα MainWindow και ενα Dialog.
-Κάτι τέτοιο κατάλαβα και εγώ απλά δεν ξέρω πως μπορώ να δημιουργήσω ένα Dialog έχοντας υπόψιν σαν παράδειγμα το QInputDialog::GetInt .
2)Παρατήρησα οτι χρησιμοποιεις καπου SLOT με όρισμα (συγκεκριμενα στο MainWindow.h σειρα 22 )
@void Proccess(int a);@
Δεν ειδα ομως παρακατω να τη χρησιμοποιεις σε connect και ισως εχω αδικο.
- Η συγκεκριμένη διαδικασία δεν είναι ενωμένη με κανένα κουμπί ούτως ώστε να χρειαστεί να την κάνω connect ή κάτι τέτοιο. Είναι μια διαδικασία που την έκανα μόνος μου για να παίρνει ένα όρισμα , στην περίπτωσή μας τον αριθμό που υποτίθετε κρατάμα από το 2ο παράθυρο και να τον βάζει στο Qlabel του πρώτου παραθύρου.
3) Τα ονόματα των συναρτήσεων σου, φαινονται σαν να εχουν προελθει απο συνδεσεις μεσω του Design. Πρόσφατα, είχα ένα προβληματακι με αυτες τις συνδεσεις και εχω αποφασισει νατις κανω manual για να μπορω να κανω και αποσύνδεση αν χρειαστει. Είμαι αρχαριος στο Qt και ισως κανω λαθος… αλλα καπου αποθηκευονται αυτες οι συνδεσεις και μετα δε μπορεις να τις χειριστεις (Τουλαχιστον εγω, αναγκαστικα και εφτιαξα απο την αρχη όλο το MainWindow εξαιτιας μιας τετοιας συνδεσης που δεν εσβηνε απο πουθενα)
- Ναι όλο το Design που έκανα το έκανα μέσω Qt Designer , μου είναι πολύ πιο εύκολο να χρησιμοποιώ αυτές τις μεθόδους παρά το QPushButton new *button1 e.t.c ... Δεν ξέρω γι' αυτό που λες πάντως δεν μου δημιούργησε πρόβλημα στο μέχρι τώρα πρόγραμμα που έχω φτιάξει...
4) Νομιζω πως πρεπει να ανοιγεις το δευτερο MainWindow (που μαλλον θα γινει Dialog) με exec() και οχι με show()… δε θες παραλληλη προσβαση και στα 2… τουλαχιστον ετσι καταλαβα. και έπειτα, για να γυρισεις στο MainWindow, απλα θα πρεπει να κλείσεις το διαλογο και θα γυρισει μονο του. (Η προταση μου, χωρις να ειμαι σιγουρος, ειναι να γινει ο διαλογος Int και κλεινοντας να επιστρεφει την καταλληλη τιμη αλλα δεν το εχω ψαξει και δεν ξερω ακομα αν και πως γινεται αυτο)
- Στην τωρινή του μορφή δηλαδή σαν MainWindow2 δεν τρέχει η εντολή exec(), συγκεκριμένα μου βγάζει το σφάλμα : 'class MainWindow2' has no member named 'exec'
5)Αυτο το:
@key2.on_Done_clicked();@
στη γραμη 42 του MainWindow.cpp τι ειναι?
- Ας πάρουμε για παράδειγμα αυτό το μέρος του προγράμματος :
@void MainWindow2::on_Done_clicked()
{
int k;
k = GetNumber();
//Θέτουμε την μεταβλητή key1 σαν class MainWindow1
MainWindow1 key1;
//Oύτως ώστε να μπορέσουμε από το MainWindow2 να χρησιμοποιήσουμε
// τις συναρτήσεις της MainWindow1 ( εδώ π.χ. η Proccess(k) )
key1.Proccess(k);
openOldWindow();
}@ -
ΥΓ: Θα μπορουσα να σε βοηθησω περισσοτερο αν ηξερα τι ακριβως θελεις να κανεις(Απλα ελληνικα… χωρις κωδικα… και μετα τον βλεπουμε και αυτον.)Δηλαδη:
-Ξεκιναμε απο ενα MainWindow (το οποιο καλει αμεσως ενα διαλογο)
-Ο διαλογος παιρνει μια τιμη και την επιστρεφει στo MainWindow για επεξεργασια(ή την επεξεργαζεται και αυτος πρωτα?)
-Μετα το MainWindow τι επεξεργασια θελεις να κανει? κλπ- Νομίζω τώρα το εξήγησα και πάνω πριν τον κώδικα αλλά ας το ξαναπώ με λίγα λόγια :
1-- Ο χρήστης πατάει το κουμπί Recount και εμφανίζεται το 2ο παράθυρο
2-- Γράφει μια τιμή στο QLineEdit
3-- Πατώντας το Done επιστρέφει στο 1ο παράθυρο
4-- Πατώντας το Count η τιμή που έγραψε εμφανίζεται στο QLabel
Τέλος ευχαριστώ και πάλι μόνο και μόνο που ασχολήθηκες και εσύ και για όποιον άλλον θέλει να ασχοληθεί. Τώρα σαν ερώτηση δική μου. Πως θα μπορέσω να δημιουργήσω αυτό το Dialog που όλοι μου λέτε , και πως θα μπορέσω να το κάνω να συμπεριφέρετε σαν την MainWindow2(που στην συγκεκριμένη περίπτωση είναι class QWidget)
- Νομίζω τώρα το εξήγησα και πάνω πριν τον κώδικα αλλά ας το ξαναπώ με λίγα λόγια :
-
Βασικα δεν ασχολήθηκα αρκετά ακόμα...
και τώρα ετοιμαζομαι να πεσω για ύπνο.Λοιπον... αν έχεις το Qt Creator:
Ξεκινας και φτιαχνεις project με το διάλογό σου
(Μην μπεις στα signals/slots απλα βαλε δυο κουμπια και ενα label)
Βέβαια νομιζω πως θα χρειαστεις ενα label για καθε ομαδα και ενα widjet
επιλογεα της ομαδας ή κατι τετοιο αλλα δεν εχουμε φτασει ακομα εκει...Έπειτα... για να κατασκευασεις το διαλογο, πας απο το
file->new file or project->Qt->Qt Designer Form Class
και καπου εκει σου βγάζει το Dialog withowt buttons
και μετα το κανεις add στο project.Σε βγαζει να δημιουργήσεις το διαλογο
και εδω νομίζω πως πρεπει να βαλλεις και τα κουμπιά που θα γραφει ο χρήστης
και αυτα που χρειαζεσαι απο το mainwindow2 που δειχνεις γιατι στην
πραγματικοτητα θες σε αυτό το διάλογο να μπορει να γραψει ο χρηστης...
δε νομιζω να θελεις ο διάλογος να ανοίγει καινουριο διαλογο για να γράψει ο χρηστης...
μετα ο πρωτος(πρωιν mainwindow2) τι ρολο παιζει?Μετα, έχεις απλως να προσθεσεις(define) στο mainwindow.h το dialog.h
και τις slots που χρειαζεσαι
Έπειτα στο mainwindow.ccp κανεις τα connect...
Τελος... μπαινεις στα connect και φτιαχνεις τον υπολοιπο κωδικα σουΥΓ: θα δοκιμασω αυριο το βραδακι γιατι δε θα βρω χρονο νωριτερα
καλη τυχη μεχρι τοτε -
Το δοκίμασα μεχρι να ανοίξει ο διάλογος..
ο κώδικας που πρέπει να προσθεσεις είναι:στη mainwindow.h
@#include "dialog.h"@
και
@
private slots:
void pB_clicked();@και στη mainwindow.cpp:
αμεσως μετα το setupUi
@
connect(ui->pushButton,SIGNAL(clicked()),this,SLOT(pB_clicked()));@
και τη συνάρτηση:
@void MainWindow::pB_clicked()
{
Dialog *mDialog= new Dialog();
mDialog->setAttribute(Qt::WA_DeleteOnClose,true);mDialog->exec();
}
@ -
Οκέι, μετέτρεψα όλο μου τον κώδικα, δηλαδή και τα 2 QWidgets που είχα κάνει σε QDialogs, και πάλι όμως δεν μπορώ να πάρω την τιμή από το 2ο παράθυρο... Αυτό που καταλαβαίνω τελικά είναι πως δεν έχει σημασία το αν είναι QWidget, QDialog ή οτιδήποτε, απλά κάπου το χάνω και δεν ξέρω που......
Δείτε λίγο τους Νέους κώδικες σε 2 QDialog αυτή τη φορά:
-
MainWindow1.h
@#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H
#include <QDialog>
#include <QPushButton>
#include <mainwindow2.h>namespace Ui {
class MainWindow1;
}class MainWindow1 : public QDialog
{
Q_OBJECTpublic:
explicit MainWindow1(QWidget *parent = 0);
~MainWindow1();public slots:
void pB_clicked();
void on_Count_clicked();
void Proccess(int a);private:
Ui::MainWindow1 *ui;
class MainWindow2 *mMyNewWindow;
};#endif // MAINWINDOW1_H
@MainWindow1.cpp
@#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "mainwindow2.h"
#include <QDialog>
#include <QPushButton>MainWindow1::MainWindow1(QWidget *parent) :
QDialog(parent),
ui(new Ui::MainWindow1)
{
ui->setupUi(this);
QObject::connect(ui->Record,SIGNAL(clicked()),this,SLOT(pB_clicked()));
QObject::connect(ui->Count, SIGNAL( clicked() ), this, SLOT(on_Count_clicked()));
}MainWindow1::~MainWindow1()
{
delete ui;
}void MainWindow1::on_Count_clicked()
{
int number;
MainWindow2 key2;
key2.on_Done_clicked();
}void MainWindow1::Proccess(int a)
{
ui->label->setNum(a);
}void MainWindow::pB_clicked()
{
mMyNewWindow = new MainWindow2();
mMyNewWindow->setAttribute(Qt::WA_DeleteOnClose,true);mMyNewWindow->exec();
}@
Και τώρα αυτό που μένει είναι να συνδέσουμε και το 2ο QDialog με όνομα MainWindow2, oύτως ώστε να τερματίζει όταν πατάμε το κουμπί Done και να στέλνει την τιμή που εισήγαγε ο χρήστης. Ο τρόπος σου λειτουργεί μέχρι στιγμής
-
[quote author="VPellas" date="1365396062"]Οκέι, μετέτρεψα όλο μου τον κώδικα, δηλαδή και τα 2 QWidgets που είχα κάνει σε QDialogs, και πάλι όμως δεν μπορώ να πάρω την τιμή από το 2ο παράθυρο... Αυτό που καταλαβαίνω τελικά είναι πως δεν έχει σημασία το αν είναι QWidget, QDialog ή οτιδήποτε, απλά κάπου το χάνω και δεν ξέρω που......
Δείτε λίγο τους Νέους κώδικες σε 2 QDialog αυτή τη φορά:
[/quote][quote author="VPellas" date="1365396724"]MainWindow1.h
@#ifndef MAINWINDOW1_H
#define MAINWINDOW1_H
#include <QDialog>
#include <QPushButton>
#include <mainwindow2.h>namespace Ui {
class MainWindow1;
}class MainWindow1 : public QDialog
{
Q_OBJECTpublic:
explicit MainWindow1(QWidget *parent = 0);
~MainWindow1();public slots:
void pB_clicked();
void on_Count_clicked();
void Proccess(int a);private:
Ui::MainWindow1 *ui;
class MainWindow2 *mMyNewWindow;
};#endif // MAINWINDOW1_H
@MainWindow1.cpp
@#include "mainwindow1.h"
#include "ui_mainwindow1.h"
#include "mainwindow2.h"
#include <QDialog>
#include <QPushButton>MainWindow1::MainWindow1(QWidget *parent) :
QDialog(parent),
ui(new Ui::MainWindow1)
{
ui->setupUi(this);
QObject::connect(ui->Record,SIGNAL(clicked()),this,SLOT(pB_clicked()));
QObject::connect(ui->Count, SIGNAL( clicked() ), this, SLOT(on_Count_clicked()));
}MainWindow1::~MainWindow1()
{
delete ui;
}void MainWindow1::on_Count_clicked()
{
int number;
MainWindow2 key2;
key2.on_Done_clicked();
}void MainWindow1::Proccess(int a)
{
ui->label->setNum(a);
}void MainWindow::pB_clicked()
{
mMyNewWindow = new MainWindow2();
mMyNewWindow->setAttribute(Qt::WA_DeleteOnClose,true);mMyNewWindow->exec();
}@
Και τώρα αυτό που μένει είναι να συνδέσουμε και το 2ο QDialog με όνομα MainWindow2, oύτως ώστε να τερματίζει όταν πατάμε το κουμπί Done και να στέλνει την τιμή που εισήγαγε ο χρήστης. Ο τρόπος σου λειτουργεί μέχρι στιγμής[/quote]
-
[quote author="koleygr" date="1365414525"]
[quote author="VPellas" date="1365396062"]Οκέι, μετέτρεψα όλο μου τον κώδικα, δηλαδή και τα 2 QWidgets που είχα κάνει σε QDialogs, και πάλι όμως δεν μπορώ να πάρω την τιμή από το 2ο παράθυρο... Αυτό που καταλαβαίνω τελικά είναι πως δεν έχει σημασία το αν είναι QWidget, QDialog ή οτιδήποτε, απλά κάπου το χάνω και δεν ξέρω που......Δείτε λίγο τους Νέους κώδικες σε 2 QDialog αυτή τη φορά:
[/quote]Όπα! και τους δύο ε?
Sorry... δικο μου λαθος... To πρώτο πρεπει να μεινει MainWindow....
τυπογραφικο ηταν
(Μαλλον πως θα χρησιμοποιήσουμε το μενου του αργοτερα...)Ξανα κανε το πρώτο MainWindow... και προσπαθησε να μην φτιαξεις μονος σου
κανενα cinnect μεσα απο το desighn...
μόνο το πρωτο connect που σου είπα εγω.ΒΑΣΙΚΟ:
Έχεις το Qt Creator?
Αν ναι... πώς ξεκινάς? Τί ειδους project δημιουργεις?
Είχα καταλαβει πως ειναι αυτο που λεει για κινητά... αλλα εμενα μου το
έβγαλε αλλιώς.Επισης αυτο το on_pbClicked() νομιζω πως ειναι το παλιο σου on_Record_Clickd...
ονομασε το οπως θελεις εσυ που να το βρισκεις ευκολαΤέλος χρειαζομαι τον source της QInputDialog και δεν τον βρισκω ευκολα.
Είδα σε προηγούμενο ποστ σου πως τον εχεις βρει..
πες μου που ειναι ή ανεβασε τον εδω.ΥΓ: Τελικα θα φτιάξεις και 2ο Dialog? εκεινο με τα κουμπακια?
ΥΓ2: Φευγω τωρα... Το βραδακι παλι
-
Κακά τα ψέματα ο προγραμματισμός είναι διαδραστικός... Αυτό που προτείνω είναι να το λύσουμε μέσω Skype ή κάτι τέτοιο, και αφού το λύσουμε(και είσαι διατεθιμένος βέβαια) να ανεβάσω εδώ την "απάντηση" στο ερώτημα μιας και δεν υπάρχει σε κανένα φόρουμ κάτι παρόμοιο(έχω ψάξει σχεδόν τα πάντα).
-
Λοιπον,
αν ενδιαφέρεται και κανεις αλλος για το προβλημα που λεγαμε,
η λύση είναι πολύ πιο απλη:
Μετα απο συνεργασια με τον VPellas, αποφασίσαμε το εξής απλό.
Αντι να φτιάξουμε καινούρια Widjets στο πρότυπα του QInputlDialog,
περάσαμε την τιμη που θελαμε σαν external int.Αυτος ο τροπος έχω διαβάσει πως δεν ειναι και ο καλύτερος απο άποψη
προγραμματισμου. Οι external μεταβλητες, θα επρεπε να αποφευγονται.
Εγώ παντως τις αγάπησα....ΥΓ: Λογικά ο VPellas θα ανεβάσει αυτες τις μέρες και τη λύση στο πρόβλημα
για οποιονδηποτε ενδιαφερεται. -
Λοιπόν, λόγω υποχρεώσεων καθυστέρησα να γράψω την απάντηση αλλά εδώ είναι. Μετά από συνεργασία με τον koleygr δώσαμε λύση σε ένα πρόβλημα που προσωπικά μου πήρε πολλές ώρες προσπάθειας και διαβάσματος... Συγκεκριμένα το πρόβλημα είναι το πως παίρνουμε τιμές από ένα QDialog σε μία QMainWindow(γίνεται και με άλλα π.χ. QWidgets αλλά με αυτά το καταφέραμε, αυτό θα παραθέσω.)
Ας δούμε λίγο τους κώδικες:
dialog.h
@#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
private slots:
void closeWindow();
};
#endif // DIALOG_H@MainWindow.h
@#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;
private slots:
void pushButtonClicked();
};
#endif // MAINWINDOW_H@Dialog.cpp
@#include "dialog.h"
#include "ui_dialog.h"
#include <mainwindow.h>
//dhlwnoume edw thn metavlhth c; (eksoteriki)
int c;
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
connect(ui->, SIGNAL( clicked() ), this, SLOT(closeWindow()));
}Dialog::~Dialog()
{
delete ui;
}
void Dialog::closeWindow()
{
QString mystring1(ui->lineEdit->text());
c = mystring1.toInt();
ui->label->setNum(c);
this->reject();
}@MainWindow.cpp
@#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"
//kai edw kanoume tin metavlhth c extern gia na mporei na xrhsimopoih8ei
extern int c;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->pushButton, SIGNAL( clicked() ), this, SLOT(pushButtonClicked()));
}MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::pushButtonClicked()
{
QString mystring(ui->Screen->text());
int k = mystring.toInt();
Dialog *dialog= new Dialog();
dialog->exec();
ui->Screen->setNum(k+c);
}@ -
Μια παρατήρηση στον παραπάνω κώδικα, είναι πως αν θελουμε να δώσουμε αρχική
τιμη στην exterrnal μεταβλητη μας, πρεπει να το κάνουμε μετά τον ορισμό της
για να μην μας βγάζει warning o compiler.Επίσης παρατήρησα πως και στο Dialog.cpp του
παραπάνω κώδικα, θα ήταν καλύτερα να δηλώσουμε την c
ως extern int c και όχι απλώς Int c.Τέλος, αν κάποιος δε θελει να χρησιμοποιήσει external μεταβλητες
στο πρόγραμμα του, μπορεί να ορίσει μια public function μεσα στο Dialog.cpp
και να την καλέσει απο το MainWindow αμεσως μετα που θα τρέξει το διάλογο
(Ο κώδικας είνα διαθέσιμος σε οποιον τον ζητήσει)