الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اطلب رأيكم، فلا تحرمني منه

بدأه killua31 في 11 فبراير 2010 · 7 رد · 1,017 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

سلام عليكم ورحمة الله ، :)

أقدم لكم هذه اللعبة ، أرجو أن تكون مسلية ، وهي أول برنامج أقوم بإنجازه :wub: ،لذلك أنا اطلب نقدكم ونصائحكم لتطويرها وتطوير امكانياتي .

فلا تبخلوا بردودكم . :wink:

جزاكم الله خيراً . :)

رابط لتحميل :

http://dl.free.fr/iidzQcIvp
#2

أظن صعب شويه إننا نحمل برنامج من شخص غريب (مشاركه واحده), برابط غريب, من موقع بلغه غريبه (الفرنسيه, فهي غير مؤلوفه عند المعظم), لعبه !!

صعب جدا, هارد لك !!

−1
#3

:ohmy:

سلام،

إذاً ماذا عسيا أفعل لكي أزيل الشكوك !! :wacko:

#4

اعمل حساب على bitbucket او github واستخدمه لمشاريعك بدل مواقع الرفع وبالطبع اللى هترفقه هو الكود المصدرى مش ملفات تنفيذية

(map share people)

فضلا لاتقم بمراسلتي من أجل أسئلة لها أقسامها في المنتدى حتى تعم الفائدة على الجميع وللحصول على إجابات أفضل من أعضاء أكثر خبرة.
Weblog
@bitbucket
@xmonader

#5

سلام،

لقد قمت بما طلب وهاهو رابط : http://bitbucket.org/jrad31/bille

والأن استطيع أن انتظر ردود ؟

#6

وعليكم السلام ورحمة الله وبركاته ،

بالنسبة للعبة فلم أفهم منطقها جيدا ، ربما لانك تستخدم اللغة الفرنسية .

لكن لي ملاحظات بسيطة على الكود ، وهي متكررة في معظم الملفات لذلك سأتحدث عن ملف واحد والبقية بنفس الفكرة.

نأخد هذه الدالة من الملف Fenpr.cpp

void Fenpr::on_aide_clicked(){
	apropos * fap;
	fap = new apropos;
    fap->show();
	close();
	}

في كل مرة يتم الضغط على الزر aide ، فانه يتم انشاء الكائن fap في الذاكرة heap ، ومن ثم اظهاره بالطريقة modeless باستخدام الدالة show ، وهكذا تستمر الدالة في العمل بينما تكون النافذة قد ظهرت ، والامر الاخير في هذه الدالة هو close .

close سوف تغلق النافذة الاولى ، وعليك ان تتذكر ان close لا يحرر الذاكرة المستخدمة لهذا الكائن ، وانما يخفي النافذة فقط.

الان نأتي للدالة التالية في ملف apropos.cpp

void apropos::on_retour_clicked(){
	Fenpr * fpr;
	fpr = new Fenpr;
    fpr->show();
	close();
}

لاحظ في حالة ضغط المستخدم على زر العودة retour فان البرنامج لا يعود للنافذة الاولى التي تم اغلاقها ! وانما ينشئ نافذة جديدة مجددا !!

أيضا لا توجد طريقة لتحرير هذه الذاكرة !

وفي حالة قمت بالضغط على زر الدخول والعودة العديد من المرات ،سنتشئ العديد من النوافذ ولن تستطيع حذف أي منهم (طبعا واحدة ستكون ظاهرة والبقية مخفيين ).

عموما عليك ان تقسم البرنامج بشكل أفضل وان تراعي مسألة حجز الذاكرة وتحريرها ، وأن كل عملية new يجب أن يقابلها delete .

لكن كما تعلم في كيوتي يمكنك الاستفادة من خاصية parent/child ، بمعنى ان تعين أب لنافذتك وترمي بمسؤولية حذف الذاكرة للاب.

مثلا لو أعدنا كتابة الدالة السابقة هكذا:

void apropos::on_retour_clicked(){
	Fenpr * fpr;
	fpr = new Fenpr(this);
    fpr->show();
	close();
}

هنا سيكون الاب للكائن fpr هو كائن الفئة apropos ويسمى this ، وفي حالة تم حذف الاب سيتم حذف الابن.

وبالتالي سنتهي من مشكلة حذف الذاكرة المستخدمة ، لكن كيف سيتم حذف الاب وانت تستدعي الدالة close ؟

طبعا يمكن محاولة الالتفاف على المشكلة باستخدام الخاصية Qt::WA_DeleteOnClose ، وهي ستحذف الكائن بمجرد ان يتم استدعاء close !

لكن في حالة تم حذف الكائن الاب ، اذا سينحذف الابن أيضا ! وبالتالي لن تظهر النافذة من الاساس !!

:wacko: :wacko: :wacko:

الى هنا سأكتفي ، وننتظر محاولاتك للخروج بحل مناسب ، فهناك الكثير من الحلول (تقريبا).

وكمحاولة مبدئية ، القي نظرة هنا :

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

    Fenpr f;
	apropos fap;

	QObject::connect(&f,SIGNAL(show_fap()),&fap,SLOT(show_fap()));
	QObject::connect(&fap,SIGNAL(fap_showed()),&f,SLOT(hide_f()));


	QObject::connect(&fap,SIGNAL(show_f()),&f,SLOT(show_f()));
	QObject::connect(&f,SIGNAL(f_showed()),&fap,SLOT(hide_fap()));

    f.show();
    return app.exec();

}

حيث حتى ننتهي من مشاكل الحجز والتحرير ، وبما أن النافذيتن fap و f يجب ان تكون احداهما مفعلة والاخرى مخفيه ، فانه من الاسهل استخدام signal/slot للمزامنة بينهم ، ويجب عليك تعريف كل من ال custom slot و عمل emit لل signal .

راجع هذا الدرس للمزيد حول signal/slot

/index.php?showtopic=190285

وفقك الله.

1
#7

قمت بالتعديل على طريقة الدخول من Fenpr الى apropos وكذلك العودة من apropos الى Fenpr .

وعليك اكمال البقية ان أدرت.

ملف main.cpp

#include <QApplication>
#include <QtGui>
#include"Fenpr.h"

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

    Fenpr f;
	apropos fap;

	QObject::connect(&f,SIGNAL(showApropos()),&fap,SLOT(show()));
	QObject::connect(&fap,SIGNAL(showFenpr()),&f,SLOT(show()));


    f.show();
    return app.exec();
}

ملف Fenpr.h

#ifndef FORM_H
#define FORM_H

#include <QtGui>
#include "ui_acceuille.h"
#include "apropos.h"
#include "Reg.h"

class apropos ;
class Reg;

class Fenpr : public QWidget,private Ui::Fenpr
{
	Q_OBJECT

	public:
		Fenpr(QWidget *parent = 0);

	public slots:
		void on_aide_clicked();	
		void on_play_clicked();


	signals:
		void showApropos();
};

#endif // FORM_H

ملف Fenpr.cpp

#include "Fenpr.h"

Fenpr::Fenpr(QWidget *parent) :   QWidget(parent)
{	QMetaObject::connectSlotsByName(this);
		setupUi(this);
}

void Fenpr::on_aide_clicked()
{
	emit showApropos();
	hide();
}

void Fenpr::on_play_clicked()
{
	Reg * freg;
	freg = new Reg;
	freg->show();
	close();
}

ملف apropos.h

#ifndef AIDE_H
#define AIDE_H

#include <QtGui>
#include "ui_aide.h"
#include "Fenpr.h"
#include "Reg.h"
class Reg;
class apropos : public QWidget , private Ui::apropos
{	
	Q_OBJECT
	public:
		apropos(QWidget * parent = 0);

	public slots:
		void on_retour_clicked();
		void on_play_clicked();


	signals:
		void showFenpr();

};

#endif // AIDE_H

ملف aprops.cpp

#include "apropos.h"

apropos::apropos(QWidget *parent) :QWidget(parent)
	{
	QMetaObject::connectSlotsByName(this);
    setupUi(this);
}
void apropos::on_retour_clicked(){
	emit showFenpr();
	hide();
}
void apropos::on_play_clicked(){
	Reg * fre;
	fre = new Reg;
	fre->show();
	close();
}

و أي سؤال يرحب به.

بالتوفيق.

#8

سلام،

جزاك الله خيراً، وسأحاول تطويرها وإن شاء الله أقدم لكم نسخة بالإنجليزية

:)

مواضيع مشابهة