LINUX.ORG.RU

[я вылез из криокамеры] Новые сигналы/слоты в Qt5 или «привет, c++11!»


0

2

!Ъ: тык

Ъ:

Старый вариант останется доступен.

Новый вариант разрешается на этапе компиляции (а не исполнения), и работает не со строками.

Было:

connect(sender, SIGNAL(valueChanged(QString,QString)), receiver, SLOT(updateValue(QString)));

Стало:

connect(sender, &Sender::valueChanged, receiver, &Receiver::updateValue );

Можно так:

connect(sender, &Sender::valueChanged, 
    tr1::bind(receiver, &Receiver::updateValue, "senderValue", tr1::placeholder::_1) );

Или так:

connect(sender, &Sender::valueChanged, [=](const QString &newValue) {
        receiver->updateValue("senderValue", newValue);
    });

Можно писать код прямо в коннектах:

void doYourStuff(const QByteArray &page)
{
    QTcpSocket *socket = new QTcpSocket;
    socket->connectToHost("qt.nokia.com", 80);
    QObject::connect(socket, &QTcpSocket::connected, [socket, page] () {
        socket->write(QByteArray("GET " + page + "\r\n"));
    });
    QObject::connect(socket, &QTcpSocket::readyRead, [socket] () {
        qDebug()<< "GOT DATA "<< socket->readAll();
    });
    QObject::connect(socket, &QTcpSocket::disconnected, [socket] () {
        qDebug()<< "DISCONNECTED ";
        socket->deleteLater();
    });
 
    QObject::connect(socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [socket] (QAbstractSocket::SocketError) {
        qDebug()<< "ERROR " << socket->errorString();
        socket->deleteLater();
    });
}

★★★★★

Последнее исправление: ChALkeR (всего исправлений: 3)

Ну и чё? Новый синтаксис не означает, что его все кинуться сразу использовать.

UVV ★★★★★
()

ух, вот быдлокодерам то раздолье будет...

shty ★★★★★
()
Ответ на: комментарий от UVV

Новый синтаксис не означает, что его все кинуться сразу использовать.

есть такое соц. явление - копипаст из туториала

shty ★★★★★
()
Ответ на: комментарий от rival

Там где-то дальше по тексту было написано, что moc никуда не денется.

Deleted
()
Ответ на: комментарий от rival

moc останется, ибо намертво к одному компилятору не привяжутся. Об этом ниже там же написано.

ChALkeR ★★★★★
() автор топика
Ответ на: комментарий от otto

Фанатики его не любят, т.к. у них уровень красноглазия падает.

Deleted
()
Ответ на: комментарий от Bad_ptr

Вроде бы не собирались. По крайней мере на вики не было.

Deleted
()
Ответ на: комментарий от ChALkeR

А как без него поддержишь gcc (для него вроде тоже плагин обещали), студию, icc и прочие компиляторы?

Gorthauer ★★★★★
()

А как насчет расшифровки синтаксиса всех вариантов кроме первого? Последние два вообще больше похожи на головоломку, чем на язык программирования.

EtherealPhantom
()

Мда, попытка расширить синтаксис C++ с его контекстной зависимостью, как и следовало ожидать, породила адский ужос, кошмар и содомию.

webhamster
()

Стоп! Кто это сюда из Talks перенёс? И почему этого нигде не видно? maxcom!

ChALkeR ★★★★★
() автор топика
Ответ на: комментарий от EtherealPhantom

А как насчет расшифровки синтаксиса всех вариантов кроме первого?

А что во 2 и 3 может быть не понятно? Или ты С++ знаешь на уроне C with Classes?

Последние два вообще больше похожи на головоломку, чем на язык программирования.

C++11

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

>А что во 2 и 3 может быть не понятно?

Троллизм головного мозга мешает чтению, очевидно же.

Deleted
()

QObject::connect(socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [socket] (QAbstractSocket::SocketError)

Мой мозг!

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

А всё потому, что функция QAbstractSocket::error перегружена.

Begemoth ★★★★★
()
Ответ на: комментарий от ChALkeR

Чем меньше функций возложено на moc, тем лучше :) А еще раньше нельзя было в качестве слота использовать функторы, а сейчас можно!

Deleted
()
Ответ на: комментарий от UVV

Да для старых программ переход на новый синтаксис ничего не поменяют.

Deleted
()
Ответ на: комментарий от otto

А чем moc так плох?

Почему бы тебе не спросить one_more_hokum?

Вообще я видел жалобы на то, что с шаблонными классами не очень дружит, а также что qmake бывает косячит и не вызывает moc, когда следует.

rival ★★
()
Ответ на: комментарий от ChALkeR

> moc останется, ибо намертво к одному компилятору не привяжутся. Об этом ниже там же написано.

Да, я читал до конца, но подумал, что быть может в отдаленном будущем (Qt 6+) таки избавятся, как-нибудь.

rival ★★
()
Ответ на: комментарий от Begemoth

1) Всё понятно. 2) Не указано, чем являются Sender и Receiver, что от них можно брать адрес и при этом они имеют своё пространство имён. 3) То же самое, что в (2) + ещё одна сущность tr1 неизвестного происхождения. 4) То же самое, что в (2) + «[=]» штука это из нового стандарта. Про новый. Про C++11 я знаю. Но как, чёрт побери, оно работает? Во что компилятор превращает эту конструкцию? 5) Раздутый вариант (4) с «[?]» и «[?,?]».

EtherealPhantom
()
Ответ на: комментарий от Begemoth

2) Если предположить, что Sender и Receiver - это классы, тогда всё становится понятно, что в примере банальное взятие адреса метода. Но ведь это явно не написано!

EtherealPhantom
()
Ответ на: комментарий от EtherealPhantom

> 2) Если предположить, что Sender и Receiver - это классы

Да, это классы.

rival ★★
()
Ответ на: комментарий от EtherealPhantom

По существу ты сказал то, что сказал, так что отнекиваться поздно.

Deleted
()
Ответ на: комментарий от EtherealPhantom

2) Не указано, чем являются Sender и Receiver, что от них можно брать адрес и при этом они имеют своё пространство имён.

Первое с чем ассоциаруется конструкция &A::b это указательна член класса и с таким предположением код понятен.

3) То же самое, что в (2) + ещё одна сущность tr1 неизвестного происхождения.

Нифига себе неизвестного, ну пропущено namespace tr1 = std::tr1, но по названию легко догадаться.

Во что компилятор превращает эту конструкцию?

Саттер о лямбдах

Begemoth ★★★★★
()
Ответ на: комментарий от anonymous

Это я читал. Сам то синтаксис лямбда-функций в принципе понятен, но когда они исполняются, в какой момент времени? Вызов обычной именованной функции, объявленной в той же области видимости перед выражением, в котором она используется, будет совершен непосредственно в точке использования результата. Использование лямбды в connect() на месте слота, означает, что она должна исполняться по сигналу. Но синтаксис предполагает либо исполнение лямбды просто как заинлайненного кода либо как использование её адреса. Что именно происходит в connect()? По логике самого connect()-а должно выполняться взятие адреса лямбды. Непонятно как синтаксически различаются случаи взятия адреса анонимной функции и взятие ее значения.

EtherealPhantom
()
Ответ на: комментарий от EtherealPhantom

Понятно, это специальный namespace для бегущих впереди паровоза. :)

Не бегщих впереди паровоза, а расширения стандартной библиотеки, полученные из опыта использования Boost.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.