ورود

View Full Version : جایگزینی اسلات با تابع معمولی در Qt5



robotic
سه شنبه 15 مرداد 1392, 21:49 عصر
در صفحه ی زیر دیدم که گفته قابلیت جدید Qt5 که در نسخه های قبلی وجود ندارد، این است که می توان به جای اسلات از توابع معمولی استفاده کرد

http://qt-project.org/wiki/New_Signal_Slot_Syntax

خودش مثالش را به صورت زیر آورده است


The new syntax can even connect to functions, not just QObjects:


connect(sender, &Sender::valueChanged, someFunction);

من این مورد را به چند طریق نوشتم ولی همواره ارور داد

لطفا یک مثال ساده بزنید تا ببینم چگونه باید از این قابلیت باید استفاده کرد.

حامد مصافی
سه شنبه 15 مرداد 1392, 21:58 عصر
//class myWindow:QMailWindow
//myBtn is a QPushButton

connect(myBtn,&QPushButton::clicked(), this, &myWindow::btn_clicked());

omidshaman
سه شنبه 15 مرداد 1392, 22:18 عصر
اقای مصافی مطمئنین این جوری که نوشتین کار می کنه؟
چیزی که من خودم استفاده می کنم:

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

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();

return a.exec();
}


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
void textChanged(QString a);
};

#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLineEdit *editor=new QLineEdit(this);
connect(editor,&QLineEdit::textChanged,
this,&MainWindow::textChanged);
}

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

void MainWindow::textChanged(QString a)
{
qDebug()<<a;
}

robotic
سه شنبه 15 مرداد 1392, 22:31 عصر
ممنون از پاسخگوییتان.

اما این مواردی که گذاشتید مانند Qt4 به صورت چهار آرگومانی است. همچنین شما به کلاسی از نوع Q_OBJECT ارجاع دادید

این نوعی که گفتم سه آرگومانی است. دو تای اولی سیگنال است. و آرگومان سوم یک تابع معمولی C است و جز کلاس و Q_OBJECT نیست.

برای همین می خواهم از این قابلیت استفاده کنم.

می خواهم وقتی کاربر دکمه ای را زد. تابعی عادی اجرا شود.

omidshaman
سه شنبه 15 مرداد 1392, 22:35 عصر
توی کد من فایل QObject رو پاک کن connect رو هم به این تبدیل کن به این شکل

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{


public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

void textChanged(QString a)
{
qDebug()<<a;
}

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLineEdit *editor=new QLineEdit(this);
connect(editor,&QLineEdit::textChanged,
textChanged);
}

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

omidshaman
سه شنبه 15 مرداد 1392, 22:43 عصر
توی پست اولی که گزاشتم هم اگر تو کانکت this رو نزارین , QOBJECT زو پاک کنین باز جواب همون میشه
حتی میشه lambda هم که تو C++‎‎‎‎‎‎‎11 معرفی شده هم استفاده کرد
این جا دربارشون توضیح داده شده
کلیک کنید ! (http://barnamenevis.org/showthread.php?408677-C-0x-C-11-%D8%A7%D8%B3%D8%AA%D8%A7%D9%86%D8%AF%D8%A7%D8%B1%D 8%AF-%D8%AC%D8%AF%DB%8C%D8%AF-%D8%B2%D8%A8%D8%A7%D9%86-C-!)
خط QMAKE_CXXFLAGS += -std=C++‎‎‎‎‎‎‎11 رو به فایل pro اضافه کن


#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
QLineEdit *editor=new QLineEdit(this);
connect(editor,&QLineEdit::textChanged,
[](QString a) { qDebug()<<a ;});
}

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

حامد مصافی
چهارشنبه 16 مرداد 1392, 15:16 عصر
ببخشید، پست من اشتباهی داشت که برطرفش کردم

omidshaman
چهارشنبه 16 مرداد 1392, 15:59 عصر
البته درستش میشه این

connect(myBtn,&QPushButton::clicked, this, &myWindow::btn_clicked);
یا معادلش این

connect(myBtn,&QPushButton::clicked, &myWindow::btn_clicked);