Просмотр сообщений
|
Страниц: [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); На сервере та же история с двумя пиксмапами. Т.е. посылаем мы только реальную картинку, но вот эти копии для скейла напрягают, может есть какой-то способ/пример, как это можно сделать по-человечески?
|
|
|
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); }
|
|
|
|
|