ورود

View Full Version : سوال: اینکه چه طور تابع موجود در این کد توسط main فراخوانی شده رو نمی فهمم.لطفا کسی توضیح بده!



motherboard
جمعه 10 مرداد 1393, 19:49 عصر
سلام.کد تو کد زیر یک مستطیل رسم میشه.اما یک چیزی رو که نمیفهمم اینه که نمی دونم اون تابع

void Colors::paintEvent(QPaintEvent *)
{

QPainter painter(this);
painter.setPen(QColor("#d4d4d4"));

painter.setBrush(QBrush("#c56c00"));
painter.drawRect(50, 50, 120, 120);
}


چه طور توسط بدنه اصلی برنامه فراخوانی شد؟
این برای قسمت main.cpp

#include "colors.h"
#include <QApplication>

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

Colors window;

window.resize(350, 280);
window.move(300, 300);
window.setWindowTitle("Colours");
window.show();

return app.exec();
}


این برای colors.cpp

#include "colors.h"
#include <QPainter>

Colors::Colors(QWidget *parent)
: QWidget(parent)
{

}

void Colors::paintEvent(QPaintEvent *)
{

QPainter painter(this);
painter.setPen(QColor("#d4d4d4"));

painter.setBrush(QBrush("#c56c00"));
painter.drawRect(50, 50, 120, 120);
}


این برای colors.h

#ifndef LINES_H
#define LINES_H
#pragma once

#include <QtWidgets>

class Colors : public QWidget
{
public:
Colors(QWidget *parent = 0);

protected:
void paintEvent(QPaintEvent *);

};
#endif // LINES_H



این برای فایل پرو

QT += gui core widgets
SOURCES += \
main.cpp \
colors.cpp

HEADERS += \
colors.h


چیزی رو که متوجه نشدم اینه که چه طور اون تابع

void Colors::paintEvent(QPaintEvent *)
{

QPainter painter(this);
painter.setPen(QColor("#d4d4d4"));

painter.setBrush(QBrush("#c56c00"));
painter.drawRect(50, 50, 120, 120);
}


با چه چیزی به بدنه اصلی برنامه وصل میشه؟؟؟

kitten
جمعه 10 مرداد 1393, 22:20 عصر
painEvent مشخصه که یه Event هستش
و معمولا این جور eventها داخل توابعی مانند resize یا move دوباره صدا زده می شوند تا وقتی صفحه تغییر کرد دوباره عمل paint انجام شود.
همین باعث می شه که شما مستطیل را ببینید.

parvizwpf
جمعه 10 مرداد 1393, 22:29 عصر
مطالعه کنید تا ببنید اصلا این تابع کی اجرا میشه و چه میکنه:
http://qt-project.org/doc/qt-4.8/qwidget.html#paintEvent

motherboard
جمعه 10 مرداد 1393, 23:08 عصر
مطالعه کنید تا ببنید اصلا این تابع کی اجرا میشه و چه میکنه:
http://qt-project.org/doc/qt-4.8/qwidget.html#paintEvent
ممنون یکی جواب داد
اقا پرویز شما سی پلاس پلاس رو وارد تر از منی.راستش من می دونم این قضیه this چیه ها و تو کتاب ها خوندم.ولی نفهیمدم دقیقا چیه!! تو کدهای کیوت هم کم و بیش هست.الان مثلا تو همین کد بالا این this داره به چی اشاره می کنه؟ و اصلا چرا اومده؟

motherboard
جمعه 10 مرداد 1393, 23:11 عصر
painEvent مشخصه که یه Event هستش
و معمولا این جور eventها داخل توابعی مانند resize یا move دوباره صدا زده می شوند تا وقتی صفحه تغییر کرد دوباره عمل paint انجام شود.
همین باعث می شه که شما مستطیل را ببینید.
ای ول.ممنون. یعنی این فراخوانی تابع ربطی به اون استفاده از this نداره؟؟ اون لامصب this تو این کد چه نقشی رو داره؟:لبخند: هر کی هرچی بلده بذاره وسط

کامبیز اسدزاده
جمعه 10 مرداد 1393, 23:23 عصر
ای ول.ممنون. یعنی این فراخوانی تابع ربطی به اون استفاده از this نداره؟؟ اون لامصب this تو این کد چه نقشی رو داره؟:لبخند: هر کی هرچی بلده بذاره وسط

خب من فکر میکنم شما با این this مشکل اساسی داری....
بزار روشنت کنم !

در C++‎‎‎ شما وقتی میخوای به یک شیئ ی که در حالت جاری وجود داره اشاره کنید از this باید استفاده کنید مثلا وقتی من داخل فرمی هستم و میخوام مثلا بدون تعریف و مشتق گیری دوباره عنوان فرمم رو ست کنم باید به زبون خودمون بگم عنوان این فرم یا واضحتر بخوام بگم باید باشه عنوان فرم جاری !.... یعنی (this)

شما در C++‎‎‎ میتونید با عملگر this به شئی جاری اشاره کنید یعنی وظیفش همینه که هست.

به مثال زیرتوجه کنید :


this->setWindowTitle("My C++‎‎‎ Form");


با استفاده از this که مختص شئی جاری یعنی فرم من هست یک عنوان به فرم جاری ست میکنم.
نه تنها در طراحی بلکه در تعریف خیلی از موارد this کاربرد داره که فقط و فقط در حالی استفاده میشه که لازمه سریعا به آبجکت جاری اشاره شود.