Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
14 / 13 / 5
Регистрация: 24.02.2011
Сообщений: 714

Реализовать код без слота

31.10.2013, 13:43. Показов 896. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть следующий код:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
void get_html::slotClickShowHtml()
{
    // бла бла бла
 
    connect(m_pnam, SIGNAL(finished(QNetworkReply*)), this, SLOT(slotFinished(QNetworkReply*)));
 
    // бла бла бла
}
 
//=============================
void get_html::slotFinished(QNetworkReply* pnr) {
    // бла бла бла
}
В нем есть соединение.
Вопрос: Возможно ли сделать это дело без слота??? Просто я хочу все деёствие программы всунуть в одну функцию, а не плодить их...
Например так (пишу с потолка):
C++ (Qt)
1
2
3
4
if (m_pnam->finished())
    {
        // бла бла бла.....
    }
Или слоты тут единственное решение???
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.10.2013, 13:43
Ответы с готовыми решениями:

Вызов слота в режиме QueuedConnection без хардока
1. Как же не хватает функции вызова слота в режиме очереди (Qt::QueuedConnection)... Единственное, что можно сделать, это захардодить...

материнка Asus P4PE-X/TE - имеет 3 слота ddr, одновременно 3 слота не работают, только 2
Здравствуйте материнка Asus P4PE-X/TE - старенькая под pent4/celeron - socket478 - имеет 3 слота ddr1, одновременно 3 слота не работают,...

Как реализовать данный код без использования объекта Vector?
public boolean expand(DefaultMutableTreeNode parent) { DefaultMutableTreeNode flag = (DefaultMutableTreeNode)parent.getFirstChild();...

7
60 / 57 / 8
Регистрация: 22.07.2011
Сообщений: 436
31.10.2013, 14:15
Если сделать это в функции, то будет выглядеть это примерно так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QNetworkReply>
#include <QEventLoop>
 
...
 
QString getHtml(const QUrl &url)
{
    QEventLoop ev;
    QNetworkReply *pReply = m_pNam->get(QNetworkRequest(url));
    QObject::connect(pReply, &QNetworkReply::finished, &ev, &QEventLoop::quit());
    ev.exec();
    
    return QString(pReply->readAll());
}
Но в этом случае, если ответ сервера достаточно большой, можно потерять кусок данных. Чтобы решить это, можно написать класс, который будет содержать что-то вроде той функции, которую я показал и слот, привязанный к QNetworkReply::readyRead().
0
14 / 13 / 5
Регистрация: 24.02.2011
Сообщений: 714
31.10.2013, 15:02  [ТС]
Функция - то что надо. Но пытаюсь сейчас её запилить в свою программу, что-то не получается... Делаю так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "get_html.h"
#include "ui_get_html.h"
 
get_html::get_html(QWidget *parent) :   QMainWindow(parent),   ui(new Ui::get_html)
{
    ui->setupUi(this);
    connect(ui->showHtmlButton, SIGNAL(clicked()), this, SLOT(slotClickShowHtml()));
 
    ui->url->setText("http://www.bogacho.ru/");
}
//===============================================
void get_html::slotClickShowHtml()
{
    QString url = QString(ui->url->text().trimmed());
    if (url == "" )
    {
        QMessageBox::critical(0, "ERROR", "Enter the site address!!!");
        return;
    }
 
    QString html_string;
    html_string = getHtml(url);
 
    ui->htmlTextArea->setText(html_string);
}
//===============================================
QString get_html::getHtml(const QUrl &url)
{
    QNetworkAccessManager* m_pNam = new QNetworkAccessManager(this);
    QEventLoop ev;
    QNetworkReply *pReply = m_pNam->get(QNetworkRequest(url));
    QObject::connect(pReply, &QNetworkReply::finished, &ev, &QEventLoop::quit());
    ev.exec();
 
    return QString(pReply->readAll());
}
//===============================================
get_html::~get_html()
{
    delete ui;
}
Но получаю вот такую ошибку:
Миниатюры
Реализовать код без слота  
0
14 / 13 / 5
Регистрация: 24.02.2011
Сообщений: 714
31.10.2013, 16:06  [ТС]
Нашел ошибку, вернее ошибКИ. Вот рабочий вариант:
C++ (Qt)
1
2
3
4
5
6
7
8
9
QString get_html::getHtml(QUrl url)
{
    QEventLoop ev;
    QNetworkAccessManager* m_pNam = new QNetworkAccessManager(this);
    QNetworkReply *pReply = m_pNam->get(QNetworkRequest(url));
    connect(pReply, SIGNAL(finished()), &ev, SLOT(quit()));
    ev.exec();
    return QString(pReply->readAll());
}
0
60 / 57 / 8
Регистрация: 22.07.2011
Сообщений: 436
31.10.2013, 17:39
В первом посте я ошибся, да. Должно быть:
C++ (Qt)
1
QObject::connect(pReply, &QNetworkReply::finished, &ev, &QEventLoop::quit);
Это в Qt5 появилось только.
Насчет
C++ (Qt)
1
const QUrl &url
. Это не ошибка. При передаче константной ссылки можно избежать копирования объекта класса, который может быть достаточно объемным. При передаче объекта мы теряем в скорости.
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
31.10.2013, 18:43
Цитата Сообщение от SDmaN Посмотреть сообщение
. Это не ошибка.
вообще ошибка тут
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void get_html::slotClickShowHtml()
{
    QString url = QString(ui->url->text().trimmed());
    if (url == "" )
    {
        QMessageBox::critical(0, "ERROR", "Enter the site address!!!");
        return;
    }
 
    QString html_string;
    html_string = getHtml(url);
 
    ui->htmlTextArea->setText(html_string);
}
Передается объект QString, а не QUrl.
0
14 / 13 / 5
Регистрация: 24.02.2011
Сообщений: 714
01.11.2013, 08:37  [ТС]
Цитата Сообщение от SDmaN Посмотреть сообщение
В первом посте я ошибся, да. Должно быть: Код C++ (QT)1
QObject::connect(pReply, &QNetworkReply::finished, &ev, &QEventLoop::quit);
А у меня заработало так:
C++ (Qt)
1
connect(pReply, SIGNAL(finished()), &ev, SLOT(quit()));
Я так понял это из-за того что у меня Qt версии 4.8?????
0
60 / 57 / 8
Регистрация: 22.07.2011
Сообщений: 436
01.11.2013, 14:28
Цитата Сообщение от lavrik Посмотреть сообщение
Я так понял это из-за того что у меня Qt версии 4.8?????
Да.

Добавлено через 4 минуты
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
вообще ошибка тут
Ну, это не мой код, я его не проверял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.11.2013, 14:28
Помогаю со студенческими работами здесь

Как реализовать код без применения ассоциативного массива (map)?
Имеется такой код. Как можно его изменить, не использую массив map? #include &lt;iostream&gt; #include &lt;map&gt; #include &lt;string&gt; ...

Вместе 4 слота памяти работают с ошибками, по одному -- без
Мат. плата: ASUS Prime B350-PLUS Память: 4x HyperX FURY 4Gb 2666 Hz: HX426C15FB/4 Процессор: AMD Ryzen 5 2600 ========= Недавно при...

Можноли установить NVMe М2 память в Материнку без слота М2?
Есть комп. Используется женой для офисно-бухгалтерской работы и вебсерфинга. На нем хранится важная инфа. Проц: i3-6100. HDD- 1Tb....

Нужен компьютер: 4 ядра,DD3 память,два слота для видеокарты и 4 слота для ОЗУ
Я хочу собрать комп. Чтобы Intel 4 ядра 3.0Ггц честота шины 1066.Мать подерживала DDR2 и DDR3,2 слота для видухи и 4 слота для оперативы.4...

В PyQt5 QML QtQuick почему не выполняется код после вызова слота?
onClicked: { // Вызываем слот калькулятора, чтобы вычесть числа calculator.sub(firstNumber.text, secondNumber.text) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru