وراثت
-
p{direction:rtl; text-align:right}. سلام
p{direction:rtl; text-align:right}. من میخوام قسمت option برنامه ام رو توی یه کلاس جدید بذارم
برای این کار اول یه کلاس به اسم option از کلاس اصلی برنامه به ارث میبرم و بعد connect برای این کلاس جدید کار نمیکنه
چی کار باید بکنم؟p{direction:rtl; text-align:right}. اگه میشه یه نمونه کد ساده برای ارتیاط فرم ها با هم بهم بدین
ممنون -
p{direction:rtl; text-align:right}. کدش دربه داغونه :)
https://github.com/silvergit/tictactoe
من تازه دارم qt رو یاد میگیرم
البته اگه یه مثال ساده با دو فرم برای ارتباط بین فرم ها میزدین بیشتر بهم کمک میشد
شما کلاً از چه روشی استفاده میکنین؟
وراثت - کلاس دوست - سیگنال و اسلات -
اگه دقیق بگی چی کار میخوای بکنی بهتر میشه کمک کرد
استفاده می کنی و میخوای یه فرم یا دیالوگ که توش درست کردی را بهش ربط بدیmainwindowاگه از
و همون سیگنال و اسلاتهconnect فکرکنم متداول ترین راهش استفاده از تایع
مثلا یه دکمه بزار وقتی کلیک شد یه تابع فراخونی کنه که توش فرم جدید ساخته شه و ادامه داستان -
p{direction:rtl; text-align:right}. برای مثال این رو در نظر بگیرید
من با qdesigner دو تا فرم طراحی میکنم و میخوام فرم دوم با کلیک روی یه دکمه بتونه یه متغیر عضو کلاس فرم اول که private هم هست رو تغییر بده یا برعکسp{direction:rtl; text-align:right}. قبلا تمام کدهامو توی یه کلاس مینوشتم و مشکلی نیود اما الان میخوام برای هر فرم یه کلاس مجزا داشته باشم
البته mainwindow و dialog و widget هم برام فرقی نداره فقط دسترسی به متغیرهای همدیگه برام مهمه -
من یه برنامه نوشتم که توش تو مین ویندو با کلیک یک فرم جدید می سازه و از کلاس مین ویندو مقدار لیبل موجود در کلاس فرم دومی رو تغییر می ده
مقدار یک رشته در کلاس فرم رو تغییر میده و میریزه تو لیبل کلاس فرم
کثیف کد زدم :D
ببین کمکت میکنه ؟
mainWindow.h
@
namespace Ui {
class MainWindow;
}
class myform;
class MainWindow : public QMainWindow
{
private slots :
void newForm();
private:
myform *myForm;
};
@
mainWindow.h
@
#include "myform.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
myForm = new myform;
connect(ui->pushButton , SIGNAL(clicked()) , this , SLOT(newForm()));
}
void MainWindow::newForm(){
MainWindow::myForm->str = "This str changed in main window class ";
QString str2 = MainWindow::myForm->str ;
MainWindow::myForm->label->setText(str2);
myForm->show();
}
@
myform.h
@
#include "ui_myform.h"
class myform : public QWidget , public Ui_Form
{
public:
myform( QWidget * parent = 0, Qt::WindowFlags f = 0 );
QString str ;
};
@
myform.cpp
@
myform::myform( QWidget *parent, Qt::WindowFlags f ) :
QWidget( parent, f )
{
setupUi( this );
str = "nothing";
}
@ -
-
p{direction:rtl; text-align:right}. ممنون محسن جان
مصطفی جان ممنون بابت کدت اما نتونستم کامپایلش کنم میشه کد رو برام آپلود کنی؟p{direction:rtl; text-align:right}. توی این خط
@class myform : public QWidget , public Ui_Form@
p{direction:rtl; text-align:right}. خطا داشتم که با این جایگزینش کردم
@class myform : public QWidget , public Ui_myform@p{direction:rtl; text-align:right}. این رو هم نفهمیدم
@myform::myform( QWidget *parent, Qt::WindowFlags f ) :
QWidget( parent, f )@p{direction:rtl; text-align:right}. اون f چیه
-
p{direction:rtl; text-align:right}.
https://github.com/bs994/example1
اینجا سورس اصلی رو اپ کردم
Public Ui_Form :
اونو واسه این گذاشته بودم که بتونم از تو کلاس mainWindow به ویجت های کلاس فرمم دسترسی مستقیم داشته باشم
QT::WindowFlags :
http://doc.qt.nokia.com/4.7-snapshot/widgets-windowflags.html -
p{direction:rtl; text-align:right}. خب نصف مشکل حل شد
فقط یه چیز برای برگشت ارتباط باید چه کرد؟
مثلا توی برنامه شما اگه بخوام با کلیک روی لیبل توی ویجت یه چیزی توی مین ویندو مثل متن دکمه رو عوض کنم چظور؟
برای ارتباط دوطرفه راهی پیدا نکردمp{direction:rtl; text-align:right}. البته این کارها رو کردم ولی به نتیجه ای نرسیدم
اول توی MainWindow یه اسلات برای تغییر متن دکمه گذاشتم
بعد یه سیگنال کلیک برای لیبل توی myForm که همون ویجت دوم باشه تعریف کردمp{direction:rtl; text-align:right}. این که کار نمیده
Mainwindow::changeBtnText();p{direction:rtl; text-align:right}. نمیشه هم دوباره توی myForm یه شیء جدید از MainWindow ساخت.
-
p{direction:rtl; text-align:right}. خب من از راه سیگنال و اسلات تونستم یه کارایی بکنم
باید توی فرم اول یه ارتباط برقرار کنم بین یه سیگنال از فرم دوم و یه اسلات از فرم اول
این طوری هم متغیرها private میمونن و هم نیازی نیست دوباره توی فرم دوم یه شیء از فرم اول بسازیمp{direction:rtl; text-align:right}. اما برنامه خودم نمیدونم چرا زمان اجرا کردن فرم دوم هنگ میکنه و مینویسه یه خطای غیرمنتظره رخ داده
از توی Debugger هم چیزی نفهمیدمp{direction:rtl; text-align:right}. مصطفی جان میشه یه نگاهی بهش بندازی؟
http://www.mediafire.com/?foc7ybfxrkw08fu