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

هذه تجاربي مع نوافذ Mdi السلام عليكم ورحمة الله وبركاته

بدأه محمـد عواد في 23 ديسمبر 2009 · 3 رد · 1,041 مشاهدة · في قسم Cross Platform GUI Libraries العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

أفلحت أخيرا في جعل النافذة الرئيسية المصممة بالديزاينر من النوع mdi

لكني اكتشفت أنها لا تقبل القوائم ولا التول بار

هذا ملف main.cpp

كود

==========

#include <QtGui/QApplication>
#include <MdiArea.h>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MdiArea w;
    w.show();
    return a.exec();
}

===========

وهذا ملف الهيدر mdiarea.h

=================

#ifndef MDIAREA_H
#define MDIAREA_H

#include <QMdiArea>


namespace Ui {
    class MdiArea;
}

class MdiArea : public QMdiArea {
    Q_OBJECT
public:
    MdiArea(QWidget *parent = 0);
    ~MdiArea();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::MdiArea *ui;
};

#endif // MDIAREA_H

===========

وهذا ملف السورس mdiarea.cpp

===========

#include "MdiArea.h"
#include "ui_mdiarea.h"

MdiArea::MdiArea(QWidget *parent) :
    QMdiArea(parent),
    ui(new Ui::MdiArea)
{
    ui->setupUi(this);
}

MdiArea::~MdiArea()
{
    delete ui;
}

void MdiArea::changeEvent(QEvent *e)
{
    QMdiArea::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

============

الطريقة الثانية هو وضع الأداة mdiarea على النافذة الرئيسية

وهذه تعتبر بالنسبة لي أفضل طريقة ولكني لم أعرف كيف أجعل ال submainwindow غير ظاهرة عند بداية البرنامج بحيث يقوم المستخدم باستدعائها وقتما شاء

الطريقة الثالثة قمت بالتحايل على ملفات المين ويندو لتحويلها إلى أم دي آي فكانت النتيجة كما بالصورة

صورة

post-216903-12615988286975_thumb.jpg

تحولت القوائم والتول بار إلى ما يشبه subwindow

وهذا ما قمت بتعديله

ملف main.cpp

#include <QtGui/QApplication>
#include "mdiarea.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MdiArea w;
    w.show();
    return a.exec();
}

ملف الهيدر

#ifndef MDIAREA_H
#define MDIAREA_H

#include <QMdiArea>

namespace Ui {
    class MdiArea;
}

class MdiArea : public QMdiArea {
    Q_OBJECT
public:
    MdiArea(QWidget *parent = 0);
    ~MdiArea();

protected:
    void changeEvent(QEvent *e);

private:
    Ui::MdiArea *ui;
};

#endif // MDIAREA_H

ملف السورس mdiarea.cpp

#include "mdiarea.h"
#include "ui_mdiarea.h"

MdiArea::MdiArea(QWidget *parent) :
    QMdiArea(parent),
    ui(new Ui::MdiArea)
{
    ui->setupUi(this);
}

MdiArea::~MdiArea()
{
    delete ui;
}

void MdiArea::changeEvent(QEvent *e)
{
    QMdiArea::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

ملف ui بعد تعديله بالنوت باد

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MdiArea</class>
 <widget class="QMdiArea" name="MdiArea">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>600</width>
    <height>400</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MdiArea</string>
  </property>
  <widget class="QWidget" name="centralWidget"/>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>600</width>
     <height>20</height>
    </rect>
   </property>
   <widget class="QMenu" name="menu">
    <property name="title">
     <string>ملف</string>
    </property>
    <addaction name="action"/>
    <addaction name="action_2"/>
   </widget>
   <addaction name="menu"/>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
   <addaction name="actionDFD"/>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
  <action name="action">
   <property name="text">
    <string>تحرير</string>
   </property>
  </action>
  <action name="action_2">
   <property name="text">
    <string>فتح</string>
   </property>
  </action>
  <action name="actionDFD">
   <property name="text">
    <string>DFD</string>
   </property>
  </action>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

مع العلم أنني لم أتأسس في السي بلس بلس أصلا لذلك أنا أسير بخطوات غير منهجية في التعلم تعتمد على التجربة غالبا وهذا هو الذي أتعبني

حاولت أن أفهم أساسيات لغة سي بلس بلس ولكن وجدت صعوبة كبيرة جدا في فهمها

أنا الآن في حالة إحباط ولا أدري ماذا أفعل

هل يمكن أن أتعلم البرمجة بهذه الطريقة

تم تعديل هذه المشاركة بواسطة SudaNix في 25 ديسمبر 2009 في 11:00 — السبب: اضافة الوسم code

#2

تفضل تجربتي

main.cpp

#include <QApplication>
#include <QTextCodec>

#include "MainWindow.h"

int main(int argc,char *argv[])
{
    QApplication App(argc,argv);
    App.setLayoutDirection(Qt::RightToLeft);
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

MainWindow MainForm;
MainForm.show();

}

MainWindow.cpp

#include <QtGui>

#include "MainWindow.h"

MainWindow::MainWindow()
{
    MDIForm = new QMdiArea;
    this->setCentralWidget(MDIForm);
}
}

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class QMdiArea;

class MainWindow : public QMainWindow
{
    Q_OBJECT

    public:
    MainWindow();

    private:
    QMdiArea *MDIForm;

};

#endif

بالتوفيق...

#3

أخي الكريم محمـد عواد ،

ما تفعله ليس ب Mdi Window ، حيث المفروض ان تكون هناك نافذة رئيسية mdiarea تقوم باستدعاء نوافذ فرعية سواءا كانت QWidget او QDialog.

القي نظرة على المثال:

http://doc.trolltech.com/4.6/mainwindows-mdi.html

وبما أنك حديث عهد بلغة سي++ ، فيفضل ان تستمر قليلا معها وتتعلم الاساسيات من تكرار ودوال ومؤشرات و مواضيع ال OOP وانشاء الفئات يجب أن تعرفها جيدا.

ابدأ باي كتاب مثلا كتاب الاكسير اذا كنت تفضل الكتب العربية ، او كتاب Teach Yourself C++ in 21 Days كتاب جميل ويعلمك الاساسيات بسرعة.

بعد ذلك لن تواجه مشاكل في كيوتي باذن الله.

وفقك الله.

#4
SudaNix كتب:

أخي الكريم محمـد عواد ،

ما تفعله ليس ب Mdi Window ، حيث المفروض ان تكون هناك نافذة رئيسية mdiarea تقوم باستدعاء نوافذ فرعية سواءا كانت QWidget او QDialog.

القي نظرة على المثال:

http://doc.trolltech.com/4.6/mainwindows-mdi.html

وبما أنك حديث عهد بلغة سي++ ، فيفضل ان تستمر قليلا معها وتتعلم الاساسيات من تكرار ودوال ومؤشرات و مواضيع ال OOP وانشاء الفئات يجب أن تعرفها جيدا.

ابدأ باي كتاب مثلا كتاب الاكسير اذا كنت تفضل الكتب العربية ، او كتاب Teach Yourself C++ in 21 Days كتاب جميل ويعلمك الاساسيات بسرعة.

بعد ذلك لن تواجه مشاكل في كيوتي باذن الله.

وفقك الله.

بارك الله فيك وأحسن الله إليك

فعلا أنا كنت محتاج لمثل هذه النصائح ، سأعمل بنصائحك إن شاء الله خصوصا إنني للأسف ميح في الإنجليزية

اكرر شكري وتقديري لك ولكل أدارة وأعضاء هذا المنتدى الرائع

اقتباس
تفضل تجربتي

بارك الله فيك أخي الكريم العربي وجزاك الله خيرا

تم تعديل هذه المشاركة بواسطة محمـد عواد في 27 ديسمبر 2009 في 17:48

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…