Προς το περιεχόμενο

Qt σχεδίαση γραμμών σε σχέση με τη θέση του ποντικιού


karabouzouk...

Προτεινόμενες αναρτήσεις

Δημοσ.

Eγώ δεν μπορώ να το τρέξω διότι, όπως σου είπα πριν καιρό, στα windows βλέπω μια μαύρη οθόνη.

Μόνον ο δείκτης του ποντικιού ήταν διαφανής.

 

Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ;

Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ;

 

-

  • Απαντ. 73
  • Δημ.
  • Τελ. απάντηση
Δημοσ.

Eγώ δεν μπορώ να το τρέξω διότι, όπως σου είπα πριν καιρό, στα windows βλέπω μια μαύρη οθόνη.

Μόνον ο δείκτης του ποντικιού ήταν διαφανής.

 

Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ;

Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ;

 

-

Δημοσ.

Δοκίμασε αν θες να κάνεις σχόλιο την εντολή w1.setAttribute(Qt::WA_TranslucentBackground); στη main..

είναι αυτή που κάνει το παράθυρο διάφανο(που δεν μας ενδιαφέρει τώρα) μάλλον αυτή θα κάνει το πρόβλημα..

 

Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ;

Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ;

Όχι η ανάκλαση γίνεται σωστά αλλά για κάποιο λόγο σε μερικές περιοχές καθώς κουνάω το ποντίκι δεν σχεδιάζονται οι γραμμές εκτός από αυτή που ξεκινάει από το αρχικό σημείο προς τον κέρσορα.

Κάτι δεν κάνω σωστά εκεί που τις περνάω στη λίστα υποψιάζομαι..

Δημοσ.

Δοκίμασε αν θες να κάνεις σχόλιο την εντολή w1.setAttribute(Qt::WA_TranslucentBackground); στη main..

είναι αυτή που κάνει το παράθυρο διάφανο(που δεν μας ενδιαφέρει τώρα) μάλλον αυτή θα κάνει το πρόβλημα..

 

Τι εννοείς όταν λες ότι δεν δουλεύει για περισσότερες γραμμές ;

Ότι οι ευθείες που προκύπτουν μετά την πρώτη ανάκλαση δεν ανακλώνται σωστά στους άλλους τοίχους ;

Όχι η ανάκλαση γίνεται σωστά αλλά για κάποιο λόγο σε μερικές περιοχές καθώς κουνάω το ποντίκι δεν σχεδιάζονται οι γραμμές εκτός από αυτή που ξεκινάει από το αρχικό σημείο προς τον κέρσορα.

Κάτι δεν κάνω σωστά εκεί που τις περνάω στη λίστα υποψιάζομαι..

Δημοσ.
Με αυτό τον τρόπο που είπες δεν το έκανες..?

αυτήν τη φορά όχι

υπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ)

βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ

και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α

 

.

Δημοσ.
Με αυτό τον τρόπο που είπες δεν το έκανες..?

αυτήν τη φορά όχι

υπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ)

βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ

και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α

 

.

Δημοσ.
αυτήν τη φορά όχι

υπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ)

βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ

και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α

 

.

 

ena proxeiro sxhma (to poio proxeiro pou mporeis na kaneis) tha vohthouse polu..! Gia na katalavw apo pou metras tis gvnies..

 

(suggnwmh gia ton trwpo grafhs alla o upologisths pou eimai den exei ellhnika kai den paizei na tou ta perasw gia ena munhma..!)

 

 

γωνία πρόσπτωσης

Δημοσ.
αυτήν τη φορά όχι

υπολογίζω την γωνία πρόσπτωσης (α) ως διαφορά ευθείας-τοίχου(β) και ακτίνας (γ)

βρίσκω το σημείο τομής προσπίπτουσας και τοίχου α=β-γ

και απο αυτό σχεδιάζω μιά ευθεία με γωνία (δ) ίση με την γωνία του τοίχου συν την γωνία πρόσπτωσης δ=β+α

 

.

 

ena proxeiro sxhma (to poio proxeiro pou mporeis na kaneis) tha vohthouse polu..! Gia na katalavw apo pou metras tis gvnies..

 

(suggnwmh gia ton trwpo grafhs alla o upologisths pou eimai den exei ellhnika kai den paizei na tou ta perasw gia ena munhma..!)

 

 

γωνία πρόσπτωσης

Δημοσ.

παραθέτω ένα screenshot

απο το gtroza-cad ! :o

 

σβύσε το .txt απο το karabouzouk5.pdf.txt

είναι pdf κανονικο

με την ps2pdf

 

όλες οι γωνίες απο το 0 (3ηωρα)

προσοχή στο ποιό ειναι το x1,y1 x2,y2 για τις ευθείες σε σχέση με την γωνία

χρησιμοποίησα την atan2(dy,dx)=>γωνία σε ακτίνια

 

τελικά

η γωνία της ευθείας ανάκλασης ως προς την οριζόντια

είναι ίση με τη γωνία της ευθείας πρόσπτωσης ως προς την οριζόντια

συν 2 φορές την γωνία πρόσπτωσης (γωνία ευθείας με τοίχο)

 

.

Δημοσ.

παραθέτω ένα screenshot

απο το gtroza-cad ! :o

 

σβύσε το .txt απο το karabouzouk5.pdf.txt

είναι pdf κανονικο

με την ps2pdf

 

όλες οι γωνίες απο το 0 (3ηωρα)

προσοχή στο ποιό ειναι το x1,y1 x2,y2 για τις ευθείες σε σχέση με την γωνία

χρησιμοποίησα την atan2(dy,dx)=>γωνία σε ακτίνια

 

τελικά

η γωνία της ευθείας ανάκλασης ως προς την οριζόντια

είναι ίση με τη γωνία της ευθείας πρόσπτωσης ως προς την οριζόντια

συν 2 φορές την γωνία πρόσπτωσης (γωνία ευθείας με τοίχο)

 

.

post-36682-129063131212_thumb.jpg

karabouzouk5.pdf.txt

Δημοσ.

Ο κώδικας διορθώθηκε και δουλεύει τέλεια..

Απλά μένουν να προγραμματιστούν διάφορες ευκολίες για τον ορισμό των τοίχων κλπ... Κατά τα άλλα αν αυτοί οριστούν στον κώδικα χειροκίνητα λειτουργούν κανονικότατα.

Το λάθος που είχε ο προηγούμενος κώδικα ήταν ότι η γραμμή

minraylength = maxlength; που αρχικοποιεί την απόσταση από τοίχο στο μέγιστο είχε ξεμείνει έξω από τη for που υπολογίζει περισσότερες ακτίνες...

Τέλος πάντων ο κώδικας..

 

>#include <QtGui>

class MyWidget : public QWidget
{
public:
   MyWidget();

private:
   QList <QLineF> walls;
   QList <QLineF> reflexingLines;
   QLineF tempLine;
   int repainttimer/*time between refreshes*/, refreshrate/*in Hz*/, timerID, maxReflexingLines;
   int reflexingLineCount, reflexingwall, prevreflexingwall;
   QPointF cursorpos, startpos;
   QPointF intersectionpoint, tempintersectionpoint;
   double maxlength, minraylength;
   bool clickThroughWindowFlag, statsFlag;


protected:
   void paintEvent(QPaintEvent *);
   void timerEvent(QTimerEvent *);
   void keyPressEvent(QKeyEvent *);
   void resizeEvent(QResizeEvent *);
   //bool event(QEvent *);
};


MyWidget::MyWidget()
{
   refreshrate = 40;
   repainttimer = 1000/refreshrate;
   timerID = startTimer(repainttimer);

   maxReflexingLines = 3;
   
   startpos = QPoint(0, 0);
   clickThroughWindowFlag = false;
   statsFlag = true;

   walls << QLineF(rect().topRight(), rect().bottomRight());
   walls << QLineF(rect().bottomRight(), rect().bottomLeft());
   walls << QLineF(rect().bottomLeft(), rect().topLeft());
   walls << QLineF(rect().topLeft(), rect().topRight());
   
}

void MyWidget::resizeEvent(QResizeEvent *){
   walls.replace(0, QLineF(rect().topRight(), rect().bottomRight()));
   walls.replace(1, QLineF(rect().bottomRight(), rect().bottomLeft()));
   walls.replace(2, QLineF(rect().bottomLeft(), rect().topLeft()));
   walls.replace(3, QLineF(rect().topLeft(), rect().topRight()));

   maxlength = rect().width() + rect().height();
}


void MyWidget::keyPressEvent(QKeyEvent *keyevent){

   if(keyevent->key()==(Qt::Key_F)){
       startpos = cursorpos;
   }

   if(keyevent->key() == Qt::Key_Up){
       maxReflexingLines++;
   }

   if(keyevent->key() == Qt::Key_Down){
       if(maxReflexingLines > 1){
           maxReflexingLines--;
       }
   }

   if(keyevent->key() == Qt::Key_V){
       walls << QLineF(cursorpos.x(), rect().top(), cursorpos.x(), rect().bottom());
   }

   if(keyevent->key() == Qt::Key_H){
       walls << QLineF(rect().left(), cursorpos.y(), rect().right(), cursorpos.y());
   }

   if(keyevent->key() == Qt::Key_Escape){
       exit(0);
   }

   if(keyevent->key() == Qt::Key_C){
       for(int i = walls.size()-1; i>3; i--){
           walls.removeAt(i);
       }
   }

   if(keyevent->key()==(Qt::Key_Space)){
       clickThroughWindowFlag = !clickThroughWindowFlag;
   }

   if(keyevent->key()==(Qt::Key_S)){
       statsFlag = !statsFlag;
   }

   //increase refresh rate an restart timer.
   if(keyevent->key()==(Qt::Key_M)){
       refreshrate+=1;
       repainttimer = 1000/refreshrate;
       killTimer(timerID);
       timerID = startTimer(repainttimer);
   }

   //Decrease refresh rate and restart timer.
   if(keyevent->key()==(Qt::Key_L)){
       if (refreshrate > 1) refreshrate-=1;

       repainttimer = 1000/refreshrate;
       killTimer(timerID);
       timerID = startTimer(repainttimer);
   }
   update();
}

//bool event(QEvent *){
//
//    return false;
//}


void MyWidget::timerEvent(QTimerEvent *){
   QLineF::IntersectType interType;
   if(mapFromGlobal(QCursor::pos()) != cursorpos){

     cursorpos = mapFromGlobal(QCursor::pos());
     reflexingLines.clear();
     reflexingLines << QLineF(startpos, cursorpos);
     reflexingLines[0].setLength(maxlength);

     prevreflexingwall = -1;
     for (reflexingLineCount=0; reflexingLineCount < maxReflexingLines; reflexingLineCount++){
         minraylength = maxlength;
         for(int i=0; i<walls.size(); i++){
             if(i != prevreflexingwall){
                 interType = reflexingLines.at(reflexingLineCount).intersect(walls.at(i), &tempintersectionpoint);
                 if (interType == 1){
                     if (QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() < minraylength &&
                         QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() != 0){
                         minraylength = QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length();
                         intersectionpoint = tempintersectionpoint;
                         reflexingwall = i;
                     }
                 }
             }
         }
         prevreflexingwall = reflexingwall;
         reflexingLines[reflexingLineCount].setP2(intersectionpoint);

         reflexingLines.append(QLineF(intersectionpoint.x(), intersectionpoint.y(), 0, 0));
         reflexingLines.last().setAngle(walls[reflexingwall].angle() + reflexingLines[reflexingLineCount].angleTo(walls[reflexingwall]));
         reflexingLines.last().setLength(maxlength);
     }
     reflexingLines.last().setP2(intersectionpoint);

     update();
     //repaint();
   }
}


void MyWidget::paintEvent(QPaintEvent *)
{
   QPainter painter(this);
   painter.setRenderHint(QPainter::Antialiasing);
   painter.setPen(Qt::black);

   for (int i=0; i<reflexingLines.size(); i++){
       painter.setPen(Qt::black);
       painter.drawLine(reflexingLines.at(i));
       //painter.setPen(Qt::red);
       //painter.drawEllipse(reflexingLines.at(i).p2(), 30,30);
   }

   painter.setPen(Qt::cyan);
   for (int i=0; i<walls.size(); i++){
       painter.drawLine(walls.at(i));
   }


   //make mask in order mouse can click throught window.
   if (clickThroughWindowFlag ){
       QRegion r1(rect());
       QRegion r2(QRect(cursorpos.x()-2, cursorpos.y()-2, 5, 5));
       QRegion r3(r1.xored(r2));
       setMask(r3);
   } else {
       painter.setPen(Qt::red);
       painter.drawText(rect(), Qt::AlignCenter, "-->  Clicking Through Window Desabled  <--\nPress Space to Enable");
   }

   //draw statistics on the right of the screen.//
   if (statsFlag){
       painter.setPen(Qt::blue);
       QString strx, stry, repainttimerstr, refreshratestr, refllinesstr;
       strx.setNum(cursorpos.x(), 'g', 10);
       stry.setNum(cursorpos.y(), 'g',10);
       repainttimerstr.setNum(repainttimer, 10);
       refreshratestr.setNum(refreshrate, 10);
       refllinesstr.setNum(reflexingLines.size()-1, 10);
       painter.drawText(rect(), Qt::AlignBottom | Qt::AlignRight, strx + " , " + stry + " \n"
                        + refreshratestr + "Hz, " + repainttimerstr + "msec \n" + refllinesstr + " Refl rays \n\n");

       //painter.drawText(cursorpos, strx + " , " + stry);
   }
}

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);

   MyWidget w1;
   w1.setUpdatesEnabled(true);
   //w1.setWindowOpacity(1);
   //w1.setMouseTracking(true);
   w1.setAttribute(Qt::WA_TranslucentBackground);
   w1.setWindowFlags(Qt::WindowStaysOnTopHint);

   //w1.setAutoFillBackground(false);
   w1.showMaximized();
   //w1.show();
   //w1.showFullScreen();
   //w1.showMaximized();
   w1.setFocus();
   return app.exec();
}

 

Και το εκτελέσιμο για LINUX. (ακόμη δεν έβαλα το Qt στα windows..!)

popup_v2.zip

Δημοσ.
Ο κώδικας διορθώθηκε και δουλεύει τέλεια..

Απλά μένουν να προγραμματιστούν διάφορες ευκολίες για τον ορισμό των τοίχων κλπ... Κατά τα άλλα αν αυτοί οριστούν στον κώδικα χειροκίνητα λειτουργούν κανονικότατα.

Το λάθος που είχε ο προηγούμενος κώδικα ήταν ότι η γραμμή

minraylength = maxlength; που αρχικοποιεί την απόσταση από τοίχο στο μέγιστο είχε ξεμείνει έξω από τη for που υπολογίζει περισσότερες ακτίνες...

Τέλος πάντων ο κώδικας..

 

>#include <QtGui>

class MyWidget : public QWidget
{
public:
   MyWidget();

private:
   QList <QLineF> walls;
   QList <QLineF> reflexingLines;
   QLineF tempLine;
   int repainttimer/*time between refreshes*/, refreshrate/*in Hz*/, timerID, maxReflexingLines;
   int reflexingLineCount, reflexingwall, prevreflexingwall;
   QPointF cursorpos, startpos;
   QPointF intersectionpoint, tempintersectionpoint;
   double maxlength, minraylength;
   bool clickThroughWindowFlag, statsFlag;


protected:
   void paintEvent(QPaintEvent *);
   void timerEvent(QTimerEvent *);
   void keyPressEvent(QKeyEvent *);
   void resizeEvent(QResizeEvent *);
   //bool event(QEvent *);
};


MyWidget::MyWidget()
{
   refreshrate = 40;
   repainttimer = 1000/refreshrate;
   timerID = startTimer(repainttimer);

   maxReflexingLines = 3;
   
   startpos = QPoint(0, 0);
   clickThroughWindowFlag = false;
   statsFlag = true;

   walls << QLineF(rect().topRight(), rect().bottomRight());
   walls << QLineF(rect().bottomRight(), rect().bottomLeft());
   walls << QLineF(rect().bottomLeft(), rect().topLeft());
   walls << QLineF(rect().topLeft(), rect().topRight());
   
}

void MyWidget::resizeEvent(QResizeEvent *){
   walls.replace(0, QLineF(rect().topRight(), rect().bottomRight()));
   walls.replace(1, QLineF(rect().bottomRight(), rect().bottomLeft()));
   walls.replace(2, QLineF(rect().bottomLeft(), rect().topLeft()));
   walls.replace(3, QLineF(rect().topLeft(), rect().topRight()));

   maxlength = rect().width() + rect().height();
}


void MyWidget::keyPressEvent(QKeyEvent *keyevent){

   if(keyevent->key()==(Qt::Key_F)){
       startpos = cursorpos;
   }

   if(keyevent->key() == Qt::Key_Up){
       maxReflexingLines++;
   }

   if(keyevent->key() == Qt::Key_Down){
       if(maxReflexingLines > 1){
           maxReflexingLines--;
       }
   }

   if(keyevent->key() == Qt::Key_V){
       walls << QLineF(cursorpos.x(), rect().top(), cursorpos.x(), rect().bottom());
   }

   if(keyevent->key() == Qt::Key_H){
       walls << QLineF(rect().left(), cursorpos.y(), rect().right(), cursorpos.y());
   }

   if(keyevent->key() == Qt::Key_Escape){
       exit(0);
   }

   if(keyevent->key() == Qt::Key_C){
       for(int i = walls.size()-1; i>3; i--){
           walls.removeAt(i);
       }
   }

   if(keyevent->key()==(Qt::Key_Space)){
       clickThroughWindowFlag = !clickThroughWindowFlag;
   }

   if(keyevent->key()==(Qt::Key_S)){
       statsFlag = !statsFlag;
   }

   //increase refresh rate an restart timer.
   if(keyevent->key()==(Qt::Key_M)){
       refreshrate+=1;
       repainttimer = 1000/refreshrate;
       killTimer(timerID);
       timerID = startTimer(repainttimer);
   }

   //Decrease refresh rate and restart timer.
   if(keyevent->key()==(Qt::Key_L)){
       if (refreshrate > 1) refreshrate-=1;

       repainttimer = 1000/refreshrate;
       killTimer(timerID);
       timerID = startTimer(repainttimer);
   }
   update();
}

//bool event(QEvent *){
//
//    return false;
//}


void MyWidget::timerEvent(QTimerEvent *){
   QLineF::IntersectType interType;
   if(mapFromGlobal(QCursor::pos()) != cursorpos){

     cursorpos = mapFromGlobal(QCursor::pos());
     reflexingLines.clear();
     reflexingLines << QLineF(startpos, cursorpos);
     reflexingLines[0].setLength(maxlength);

     prevreflexingwall = -1;
     for (reflexingLineCount=0; reflexingLineCount < maxReflexingLines; reflexingLineCount++){
         minraylength = maxlength;
         for(int i=0; i<walls.size(); i++){
             if(i != prevreflexingwall){
                 interType = reflexingLines.at(reflexingLineCount).intersect(walls.at(i), &tempintersectionpoint);
                 if (interType == 1){
                     if (QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() < minraylength &&
                         QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length() != 0){
                         minraylength = QLineF(reflexingLines.at(reflexingLineCount).p1(), tempintersectionpoint).length();
                         intersectionpoint = tempintersectionpoint;
                         reflexingwall = i;
                     }
                 }
             }
         }
         prevreflexingwall = reflexingwall;
         reflexingLines[reflexingLineCount].setP2(intersectionpoint);

         reflexingLines.append(QLineF(intersectionpoint.x(), intersectionpoint.y(), 0, 0));
         reflexingLines.last().setAngle(walls[reflexingwall].angle() + reflexingLines[reflexingLineCount].angleTo(walls[reflexingwall]));
         reflexingLines.last().setLength(maxlength);
     }
     reflexingLines.last().setP2(intersectionpoint);

     update();
     //repaint();
   }
}


void MyWidget::paintEvent(QPaintEvent *)
{
   QPainter painter(this);
   painter.setRenderHint(QPainter::Antialiasing);
   painter.setPen(Qt::black);

   for (int i=0; i<reflexingLines.size(); i++){
       painter.setPen(Qt::black);
       painter.drawLine(reflexingLines.at(i));
       //painter.setPen(Qt::red);
       //painter.drawEllipse(reflexingLines.at(i).p2(), 30,30);
   }

   painter.setPen(Qt::cyan);
   for (int i=0; i<walls.size(); i++){
       painter.drawLine(walls.at(i));
   }


   //make mask in order mouse can click throught window.
   if (clickThroughWindowFlag ){
       QRegion r1(rect());
       QRegion r2(QRect(cursorpos.x()-2, cursorpos.y()-2, 5, 5));
       QRegion r3(r1.xored(r2));
       setMask(r3);
   } else {
       painter.setPen(Qt::red);
       painter.drawText(rect(), Qt::AlignCenter, "-->  Clicking Through Window Desabled  <--\nPress Space to Enable");
   }

   //draw statistics on the right of the screen.//
   if (statsFlag){
       painter.setPen(Qt::blue);
       QString strx, stry, repainttimerstr, refreshratestr, refllinesstr;
       strx.setNum(cursorpos.x(), 'g', 10);
       stry.setNum(cursorpos.y(), 'g',10);
       repainttimerstr.setNum(repainttimer, 10);
       refreshratestr.setNum(refreshrate, 10);
       refllinesstr.setNum(reflexingLines.size()-1, 10);
       painter.drawText(rect(), Qt::AlignBottom | Qt::AlignRight, strx + " , " + stry + " \n"
                        + refreshratestr + "Hz, " + repainttimerstr + "msec \n" + refllinesstr + " Refl rays \n\n");

       //painter.drawText(cursorpos, strx + " , " + stry);
   }
}

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);

   MyWidget w1;
   w1.setUpdatesEnabled(true);
   //w1.setWindowOpacity(1);
   //w1.setMouseTracking(true);
   w1.setAttribute(Qt::WA_TranslucentBackground);
   w1.setWindowFlags(Qt::WindowStaysOnTopHint);

   //w1.setAutoFillBackground(false);
   w1.showMaximized();
   //w1.show();
   //w1.showFullScreen();
   //w1.showMaximized();
   w1.setFocus();
   return app.exec();
}

 

Και το εκτελέσιμο για LINUX. (ακόμη δεν έβαλα το Qt στα windows..!)

 

Να επιβεβαιώσω ότι μόλις τώρα το έτρεξα σε Ubuntu 10.10 και λειτουργεί μια χαρά. Και να μην το βάλεις, μη σου πω βγάλε και τα Windows! :lol:

Δημοσ.
Να επιβεβαιώσω ότι μόλις τώρα το έτρεξα σε Ubuntu 10.10 και λειτουργεί μια χαρά. Και να μην το βάλεις, μη σου πω βγάλε και τα Windows!

η μόνη αλλαγή που πρέπει να γίνει στο project ! :mrgreen:

 

καλό σκ

 

.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...