Russian Qt Forum
Май 08, 2024, 04:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1]
1  Qt / Вопросы новичков / Re: Скейл QPixmap : Февраль 14, 2023, 03:33
Кхм, ну смотрите Улыбающийся, у нас есть, допустим, дефолтный вьювер изображений в том же windows, он же не изменяет изображение при его масштабировании, и в нем есть опция "масштабировать по размеру". Вот меня интересует нечто подобное в рамках Qt, как я понимаю для этого нужно скейлить не само изображение, а элемент, в который мы его помещаем? В моем случае это QLabel, ну и соответственно если он находится в QScrollArea, то и шаг скроллбаров тоже в зависимости от этого подкручивать.
2  Qt / Вопросы новичков / Re: Скейл QPixmap : Февраль 13, 2023, 22:21
Попробовал QScrollArea, окей, оно +/- работает, но меня интересует есть ли корректный способ отскейлить картинку в нужных границах (QLabel в моем случае) без потери качества и изменения фактических данных, или без создания копии функция scaled нам в любом случае "зашакалит" исходник?
3  Qt / Вопросы новичков / Скейл QPixmap : Февраль 13, 2023, 16:54
Привет, не могу найти корректного способа решить проблему со скейлом QPixmap, допустим у нас есть какая-нибудь обоина 8к, при открытии ее без скейла у меня окно улетает далеко за рамки рабочего стола. Я размещаю пиксмапу в QLabel, и если перед этим я делаю лейблу ресайз и скейлю обоину в рамках лейбла, то обоина меняет свои фактические данные. Каким образом можно вписать картинку в рамки лейбла без потери качества?

Пока я пошел таким путем, делаю две пиксмапы (копию), одну зашакаленную я вывожу "миниатюрой" в лейбле, а вторую реальную посылаю на сервер, выглядит все как-то так:
Код:
            plbl->resize(500, 500);
            plbl->clear();

            m_pImage = new QPixmap(str);
            QPixmap img = *m_pImage; // make a copy of QPixmap for correct scale
            const float aspectRatio = float(img.height())/float(img.width());
            img = img.scaled(plbl->width() * aspectRatio, plbl->height(), Qt::KeepAspectRatio);
            plbl->setPixmap(img);
            plbl->show();

            layout()->addWidget(plbl);

На сервере та же история с двумя пиксмапами. Т.е. посылаем мы только реальную картинку, но вот эти копии для скейла напрягают, может есть какой-то способ/пример, как это можно сделать по-человечески?
4  Qt / Вопросы новичков / Re: Проблема с передачей данных в клиент-сервере : Февраль 13, 2023, 01:32
Да, вы правы заметив на счет количества отправляемых данных. Решил все проблемы переписав способ сериализации, в нативных плюсах как-то немного попроще с этим.
5  Qt / Вопросы новичков / Re: Проблема с передачей данных в клиент-сервере : Февраль 12, 2023, 13:02
Я пробовал и по дефолту (30000 мс) ставить, результат тот же, просто ждем больше. На сервере я вынес QByteArray в класс и пытаюсь в цикле набить его всей информацией из сокета, но видимо что-то не так в моем понимании приема информации. В примере используется JSON, я с ним пробовал писать и проблем не было, а вот как корректно медиа передать пока не понял.
6  Qt / Вопросы новичков / Проблема с передачей данных в клиент-сервере : Февраль 12, 2023, 01:36
Привет, делаю первые шаги в Qt, столкнулся с проблемой. В общем цель - передать выбранное изображение с клиента на сервер и отобразить на сервере. Мой код работает для небольших изображений, на больших же изображениях сервер повисает. Лог пишет, что на первой итерации мы считываем, условно, 105кб из отправленных 110кб, на последующих итерациях мы не считываем вообще ничего, т.е. 0, из-за этого информация не прочитывается, и все уходит в вечный цикл и повисает.

Код отправки с клиента:
Код:
    QBuffer buffer;
    QImageWriter writer(&buffer, "jpg");
    writer.write(m_pImage->toImage());

    QByteArray barr;
    QDataStream stream(&barr, QIODevice::WriteOnly);
    stream << (quint32)buffer.size();
    barr.append(buffer.data());
    m_pTcpSocket->write(barr);
    m_pTcpSocket->waitForBytesWritten(500);

Код приема и отрисовки на сервере:
Код:
    QTcpSocket* pClientSocket = (QTcpSocket*)sender();
    for (;;) {
          if (!pClientSocket->waitForConnected(500)) continue;
        if (m_nNextBlockSize == 0)
        {
            QDataStream stream(pClientSocket);

            if (pClientSocket->bytesAvailable() < (int)sizeof(qint32))
                return;

            stream >> m_nNextBlockSize;
        }

        if (m_nNextBlockSize > pClientSocket->bytesAvailable())
            return;




        if (!bComplexData)
            barr = pClientSocket->read(m_nNextBlockSize);
        else
            barr = barr.append(pClientSocket->read(m_nNextBlockSize));
        pClientSocket->waitForReadyRead(500);
        QBuffer buffer(&barr);
        buffer.open(QIODevice::ReadOnly);

        QImageReader reader(&buffer, "jpg");
        QImage image = reader.read();
        QLabel* plbl = new QLabel;
        if (!image.isNull())
        {

            QPixmap pixmap = QPixmap::fromImage(image);
            pixmap.save(&buffer, "jpg");
            pixmap.scaled(pixmap.size() / 10,
                                         Qt::IgnoreAspectRatio,
                                         Qt::SmoothTransformation
                                        );
            //plbl->setText(tr("Picture w/h = ") + QString::number(pixmap.width()) + "/" + QString::number(pixmap.height()));
            plbl->setPixmap(pixmap);
            plbl->setFixedSize(pixmap.size());
            plbl->show();

            bComplexData = false;
            m_nNextBlockSize = 0;
        }
        else
        {
            plbl->setText(tr("Invalid image received."));
            bComplexData = true;
            slotReadClient();
        }
        plbl->show();
        layout()->addWidget(plbl);
    }
Страниц: [1]

Страница сгенерирована за 0.057 секунд. Запросов: 24.