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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 65
1  Qt / Общие вопросы / Не пробрасывается эвент QGraphicsItemGroup -> QGraphicsTextItem : Сентябрь 20, 2022, 10:42
Всем доброго дня!
Пытаюсь поимать событие по нажтию на TextItem.
Код
C++ (Qt)
class TextItem: public QGraphicsTextItem
{
...
public:
 enum { TEXT = UserType + 4 };
 int type() const { return TEXT; }
 
protected:
 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent * event);
}
 
void TextItem::mousePressEvent(QGraphicsSceneMouseEvent * event)
{
 setTextInteractionFlags(Qt::TextEditorInteraction);
 setFocus();
 
 QGraphicsTextItem::mousePressEvent(event);
}
 

Экземпляр объекта размещен внутри двух групп: Group1, Group2
Код
C++ (Qt)
class Group1: public QGraphicsItemGroup
{
...
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem * option, QWidget *widget);
QRectF boundingRect() const;
 
private:
Group2 group2;
}
 
Group1::Group1(QGraphicsItem *parent) : QGraphicsItem(parent)
{
   addToGroup(group2);
}
 
void Group1::paint(QPainter *painter, const QStyleOptionGraphicsItem * option, QWidget *widget)
{
  group2.setPos(5,5);
  ...
}
 

Код
C++ (Qt)
class Group2: public QGraphicsItemGroup
{
...
public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem * option, QWidget *widget);
QRectF boundingRect() const;
 
private:
TextItem *txtiIem;
}
 
Group2::Group2(QGraphicsItem *parent) : QGraphicsItem(parent)
{
 textItem = new TextItem("Hello");
 addToGroup(textItem);
}
 
void Group2::paint(QPainter *painter, const QStyleOptionGraphicsItem * option, QWidget *widget)
{
 textItem->setPos(10,10);
}
 


Код
C++ (Qt)
class Scene : public QGraphicsScene
{
...
protected:
void mousePressEvent(QGraphicsSceneMouseEvent * event);
 
private:
Group1 group1;
}
 
Сцена и обработчик нажатия мыши
Scene::Scene(QObject*parent) : QGraphicsScene(parent)
{
  addItem(&group1);
  group1.setPos(10, 10)
}
 
//Обработка события нажатия мыши на сцене
void Scene::mousePressEvent(QGraphicsSceneMouseEvent * event)
{
 
QGraphicsItem *item = itemAt(event->scenePos());
//если это TextItem
if(item && item->type() == TextItem::TEXT){
  sendEvent(item,event);
}
 
}
 

Почему-то обработка события нажатия клавиши мыши на сцене не доходит до TextItem::mousePressEvent(QGraphicsSceneMouseEvent * event)

Если TextItem размещен непосредственно на сцене
Код:
Scene::Scene(QObject*parent) : QGraphicsScene(parent)
{
   TextItem *textItem = new TextItem("fjgkjfgfd");
   addItem(textItem);
   textItem->setPos(10, 10);
}
то все норм событие орабатывается нормально!

Подскажите что делаю не так???
2  Qt / Общие вопросы / Re: Zoom, QGraphicsView::scale(float, float) : Сентябрь 20, 2022, 10:26
Решил вопрос с центрированием сцены Смеющийся
Код
C++ (Qt)
QGraphicsView::setAlignment(Qt::Alignment alignment)
 
3  Qt / Общие вопросы / Zoom, QGraphicsView::scale(float, float) : Сентябрь 14, 2022, 11:01
Доброго дня!


zoom.h
Код
C++ (Qt)
 
/*!
* This class adds ability to zoom QGraphicsView using mouse wheel. The point under cursor
* remains motionless while it's possible.
*
* Note that it becomes not possible when the scene's
* size is not large enough comparing to the viewport size. QGraphicsView centers the picture
* when it's smaller than the view. And QGraphicsView's scrolls boundaries don't allow to
* put any picture point at any viewport position.
*
* When the user starts scrolling, this class remembers original scene position and
* keeps it until scrolling is completed. It's better than getting original scene position at
* each scrolling step because that approach leads to position errors due to before-mentioned
* positioning restrictions.
*
* When zommed using scroll, this class emits zoomed() signal.
*
* Usage:
*
*   new Graphics_view_zoom(view);
*
* The object will be deleted automatically when the view is deleted.
*
* You can set keyboard modifiers used for zooming using set_modified(). Zooming will be
* performed only on exact match of modifiers combination. The default modifier is Ctrl.
*
* You can change zoom velocity by calling set_zoom_factor_base().
* Zoom coefficient is calculated as zoom_factor_base^angle_delta
* (see QWheelEvent::angleDelta).
* The default zoom factor base is 1.0015.
*/

 
#include <QObject>
#include <QGraphicsView>
class Graphics_view_zoom : public QObject {
 Q_OBJECT
public:
 Graphics_view_zoom(QGraphicsView* view);
 void gentle_zoom(double factor);
 void set_modifiers(Qt::KeyboardModifiers modifiers);
 void set_zoom_factor_base(double value);
 
private:
 QGraphicsView* _view;
 Qt::KeyboardModifiers _modifiers;
 double _zoom_factor_base;
 QPointF target_scene_pos, target_viewport_pos;
 bool eventFilter(QObject* object, QEvent* event);
 
signals:
 void zoomed();
};
 
zoom.cpp
 

Код
C++ (Qt)
#include "Graphics_view_zoom.h"
#include <QMouseEvent>
#include <QApplication>
#include <QScrollBar>
#include <qmath.h>
 
Graphics_view_zoom::Graphics_view_zoom(QGraphicsView* view)
 : QObject(view), _view(view)
{
 _view->viewport()->installEventFilter(this);
 _view->setMouseTracking(true);
 _modifiers = Qt::ControlModifier;
 _zoom_factor_base = 1.0015;
}
 
void Graphics_view_zoom::gentle_zoom(double factor) {
 _view->scale(factor, factor);
 _view->centerOn(target_scene_pos);
 QPointF delta_viewport_pos = target_viewport_pos - QPointF(_view->viewport()->width() / 2.0,
                                                            _view->viewport()->height() / 2.0);
 QPointF viewport_center = _view->mapFromScene(target_scene_pos) - delta_viewport_pos;
 _view->centerOn(_view->mapToScene(viewport_center.toPoint()));
 emit zoomed();
}
 
void Graphics_view_zoom::set_modifiers(Qt::KeyboardModifiers modifiers) {
 _modifiers = modifiers;
 
}
 
void Graphics_view_zoom::set_zoom_factor_base(double value) {
 _zoom_factor_base = value;
}
 
bool Graphics_view_zoom::eventFilter(QObject *object, QEvent *event) {
 if (event->type() == QEvent::MouseMove) {
   QMouseEvent* mouse_event = static_cast<QMouseEvent*>(event);
   QPointF delta = target_viewport_pos - mouse_event->pos();
   if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5) {
     target_viewport_pos = mouse_event->pos();
     target_scene_pos = _view->mapToScene(mouse_event->pos());
   }
 } else if (event->type() == QEvent::Wheel) {
   QWheelEvent* wheel_event = static_cast<QWheelEvent*>(event);
   if (QApplication::keyboardModifiers() == _modifiers) {
     if (wheel_event->orientation() == Qt::Vertical) {
       double angle = wheel_event->angleDelta().y();
       double factor = qPow(_zoom_factor_base, angle);
       gentle_zoom(factor);
 
 
       qDebug() << _view->sceneRect(); //текущий размеры размер сцены не меняется???
       return true;
     }
   }
 }
 Q_UNUSED(object)
 return false;
}
 

Выше приведенный код взял
Код:
https://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out-under-mouse-position-using-mouse-wheel

Там есть такое примечание что
Код:
Обратите внимание, что это становится невозможным, когда сцена
размер недостаточно велик по сравнению с размером области просмотра. QGraphicsView центрирует изображение
когда он меньше представления. И границы прокрутки QGraphicsView не позволяют
 поместите любую точку изображения в любую позицию окна просмотра.

В моем случае получалось так что при прокрутке скролла текущий размеры сцены не меняется почему-то...
Код
C++ (Qt)
...
qDebug() << view->sceneRect();
 
 

Как сделать, чтобы когда размер сцены меньше размера области промотра QGraphicsView не центрировал изображение,
а размещал его в левом верхнем углу области просмотра?

4  Программирование / Python / Парсинг doc, docx файлов : Июнь 22, 2022, 17:48
Всем доброго дня!
Прошу заранее прощения если задам глупый вопрос Смеющийся

Я в python полный нУль  Плачущий
Мне нужно распарсить docx файл, в котором находятся таблицы(в ячейках таблицы как может быть инфа так может быть и пусто).
Подскажите пожалуйста в каком направлении мне копать?
Было бы круто если привели какой-нибудь example

Спасибо!
5  Qt / Общие вопросы / Отрисовка текста в QGraphicsItem. : Июнь 17, 2022, 10:49
Всем доброго времени суток.

У меня вопрос по отрисовки текста внутри ячейки.
Рисуем прямоугольник и внутри его вертикально хотим написать текст)))

Текст и прямоугольник отрисовываются замечательно,
но длина текста выходит за геометрические размеры прямоугольника, то текст всеравно отрисовывается.
Ниже приведен код.

Это нрмально? Если да, то как сделать так чтобы, если та часть текста, которая выходит за геометрические
параметры boundingRect() не отрисовывалась?

Спасибо!

Код
C++ (Qt)
void Primitive::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
   Q_UNUSED(option)
   Q_UNUSED(widget)
 
   QPen pen;
   pen.setColor(color_text);
   painter->setPen(pen);
   painter->drawRect(rectf);
   painter->fillRect(rectf.x() + 1, rectf.y() + 1, rectf.width() - 1, rectf.height() - 1, color_background);
 
  painter->rotate(90);
 
  QFont font;
  font.setPixelSize(20);
  painter->setFont(font);
  painter->drawText(0, 0, QString("cell %1").arg(number, 0, 10));
}
 
QPainterPath Primitivel::shape() const
{
   QPainterPath painterpath;
   painterpath.addRect(rectf);
   return painterpath;
}
 
QRectF Primitive::boundingRect() const
{
   return rectf;
}
 
 
 
6  Qt / Пользовательский интерфейс (GUI) / Re: QGraphicsItemGroup, QGraphicsItem : Июнь 02, 2022, 15:52
думаю, все дело в том, что группа — это тоже айтем, поэтому она и получает сигнал, а дальше надо уже руками определять нужный айтем внутри группы (что просто, ведь все координаты известны).

Сделал так:
Код
C++ (Qt)
void Table::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
 
   //НО ЭТО НЕ ОЧЕНЬ ХОРОШО !!!
   Cell * cell = reinterpret_cast<Cell * >(scene()->itemAt(event->scenePos().rx(), event->scenePos().ry()));
   //
 
   qDebug() << cell->getnumber();
   QGraphicsItemGroup::mousePressEvent(event);
}
 

7  Qt / Пользовательский интерфейс (GUI) / Re: QGraphicsItemGroup, QGraphicsItem : Июнь 01, 2022, 19:02
- вы зодойоте вопросы по коду?
- нет, только показываю
- красивое...

Описал как должно работать.
Показал реализацию как у меня написано. Строит глазки
Не работает, не могу понять почему...
8  Qt / Пользовательский интерфейс (GUI) / QGraphicsItemGroup, QGraphicsItem : Июнь 01, 2022, 17:01
Добрый день!

Рисую таблицу(QGraphicsItemGroup), каждую ячейку представляю отдельным элементом(QGraphicsItem).
Соответственно таблицу  добавляю в сцену(QGraphicsScene), ну а сцену отображаю через вьюху(QGraphicsView)


У каждой ячейки таблицы есть свой номер и хотелось по нажатию на ячейку отображать ее номер в консоли.
Т.е событие нажатия пробрасывается view ->scene->itemgroup->item
Но не получается достучаться до ячейки...
Не получается прокинуть сигнал до QGraphicsItem через QGraphicsItemGroup

View
Код
C++ (Qt)
void View::mousePressEvent(QMouseEvent *event)
{
   event->ignore();
   qDebug() << "View " << event->pos();
   QGraphicsView::mousePressEvent(event);
}
 

Scene
Код
C++ (Qt)
Scene::Scene(QObject *parent) : QGraphicsScene(parent)
{
   addItem(&table);
}
 
void Scene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
   qDebug() << "Scene" << event->scenePos();
   QGraphicsScene::mousePressEvent(event);
}
 

QGraphicsItemGroup
Код
C++ (Qt)
Table::Table(QGraphicsItem * parent) : QGraphicsItemGroup(parent)
{
   int k = 0;
   for(int i =  0; i < 3; i++){
       for(int j = 0; j < 3; j++){
 
           addToGroup(&cells[i][j]);
           cells[i][j].setPos(0 + i * cells[i][j].boundingRect().width(),
                           0 + j * cells[i][j].boundingRect().height()
                           );
 
           cells[i][j].setnum(k++);
           cells[i][j].setParentItem(this);
       }
   }
}
 
void Table::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
   event->ignore();
   qDebug() << "Table" << event->pos();
   QGraphicsItemGroup::mousePressEvent(event);
}
 

QGraphicsItem
Код
C++ (Qt)
Cell::Cell(QGraphicsItem * parent) : QGraphicsItem(parent)
{
   number = 0;
}
 
void Cell::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
   Q_UNUSED(option)
   Q_UNUSED(widget)
 
   painter->drawRect(0, 0, 40, 40);
   painter->drawText(boundingRect() , QString("cell %1").arg(number, 0, 10));
}
 
QRectF Cell::boundingRect() const
{
   return QRectF(0, 0, 40, 40);
}
 
void Cell::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
   qDebug() << number;
}
 

При нажатии в консоль сваливается только такой вывод:
Код:
View  QPoint(250,227) 
Scene QPointF(184, 203)
Table QPointF(84, 103)
Table QPointF(84, 103)

Подскажите что делаю не так???

9  Qt / Работа с сетью / Re: Net-SNMP, mib2c : Май 30, 2022, 23:15
И в довершении всего, хотелось бы понять как действовать ситуации когда
тип составной(т.е состоит из нескольких параметров) или строка

Код:
DPS-MIB-V38 DEFINITIONS ::= BEGIN
IMPORTS DisplayString FROM RFC1213-MIB
OBJECT-TYPE FROM RFC-1212
enterprises FROM RFC1155-SMI;

dpsInc OBJECT IDENTIFIER ::= {enterprises 2682}
dpsAlarmControl OBJECT IDENTIFIER ::= {dpsInc 1}
tmonXM OBJECT IDENTIFIER ::= {dpsAlarmControl 1}
tmonIdent OBJECT IDENTIFIER ::= {tmonXM 1}

tmonIdentManufacturer OBJECT-TYPE
SYNTAX DisplayString
ACCESS read-only
STATUS mandatory
DESCRIPTION “The TMON/XM Unit manufacturer.”
::= {tmonIdent 1}


В выше приведенном коде  DisplayString FROM RFC1213-MIB является строковым типом
Код:
      DisplayString ::=
          OCTET STRING

или
составной тип AfdxRedundancyStatsEntry
Код:
AIRBUS-AFDX-SW-MIB DEFINITIONS ::= BEGIN

IMPORTS enterprises, Counter, IpAddress, TimeTicks FROM RFC1155-SMI
             TRAP-TYPE  FROM RFC-1215
             OBJECT-TYPE FROM RFC-1212;

...
...

afdxRedundancyStatsEntry   OBJECT-TYPE
    SYNTAX  AfdxRedundancyStatsEntry
    ACCESS  read-only
    STATUS  mandatory  
    DESCRIPTION
      "An entry in the redundancy Stats table"
    INDEX {  afdxRedundancyVLPortIndex, afdxRedundancyVLMacAddress}
    ::= { afdxRedundancyStatsTable 1 }

AfdxRedundancyStatsEntry ::= SEQUENCE {
afdxRedundancyVLPortIndex INTEGER,
afdxRedundancyVLMacAddress INTEGER,
afdxRedundancyVLIntegrityCheckError Counter,
afdxRedundancyVLFirstInFrames Counter
}

Список конфиг файлов
Код:
 mib2c.array-user.conf
 mib2c.create-dataset.conf
 mib2c.int_watch.conf
 mib2c.iterate.conf
 mib2c.iterate_access.conf
 mib2c.mfd.conf
 mib2c.notify.conf
 mib2c.old-api.conf
 mib2c.scalar.conf

Какой из конфиг-файлов можно или нужно использовать для кодогенерации mib2c???

Я так понимаю
Код:
mib2c.array-user.conf
10  Qt / XML / Re: xml-rpc : Май 24, 2022, 17:12
хедеры нужны для сервера, почитай в документации http какие являются обязательными или найди пример кода. но лучше на клиенте используй QNAM для отправки запроса, а на сервере можешь принимать данные в голом сокете, раз так хочется: там банально поиском по строке найдешь начало хмл документа.

По докумуентации ,да посмтрю в RFC2616...

И еще такой момент)))
Так как работаем с tcpsocket, то нужно разделять сообщения для этого используем соответственно разделитель (const unsigned int Delimetr = 0xABCCCCBA)
Плюс для проверки корректности высылается его размер в поле size.

Код
C++ (Qt)
const unsigned int Delimetr = 0xABCCCCBA;
 
struct message_header{
uint32_t delimetr = ::Delimetr;
uint32_t size;
};
 
void Service::prepareMessageAndSend()
{
 
//HTTP
QString http_string = "GET /something operations server will do / HTTP/1.1";
int http_str_sz = http_string.size();
 
//XML
QFile xmlfile;
...
QByteArray ba_xml = xmlfile.readAll();
int xml_file_sz = ba.size();
 
//TCP MY_MESSAGE_HEADER
message_header msghdr;
msghdr.size = sizeof(message_header) + http_str_sz + xml_file_sz;
 
//INPUT BUFFER
QByteArray buffer;
buffer.append(reinterpret_cast<char *>(&msghdr), sizeof(message_header));
buffer.append(http_string);
buffer.append(ba_xml);
 
//SEND
socket.write(buffer.data(), buffer.size());
 
}
 

Хотелось уточнить, считается ли это нормальной практикой и можно ли так делать как в вышеприведенном коде?
11  Qt / XML / Re: xml-rpc : Май 24, 2022, 11:20
гуглить не пробовал? хотя бы почитать что такое xml-rpc прежде, чем тут спрашивать Улыбающийся

если у тебя какое-то самопальное приложение, то можешь конечно тупо писать XML в сокет. но если ты хочешь следовать стандарту xml-rpc, то надо отправлять полноценный http запрос.

Приложение да самопальное)))

Пробовал)))
Я просто так до конца  и не понял В замешательстве Смеющийся

Хотелось уточнить

Голова HTTP сообщения состоит из стартовой строки вместе с заголовками(start line + headers)
Код:
 POST / HTTP/1.1                                                          <--------------start line
 Host: localhost : 8000                                                          
 User-Agent: Mozila/5.0                                                                                        
 Accept : text/html, application/xhtml + xml,...                                                      
 Accept-Language: en-US, en; q=0.5                                                                  
 Aceept-Encoding: gzip, deflate                                                                            
 Connection: keep-alive                                                                                          
 Upgrade-Insecure-Request: 1                                                                                
 Content-Type: multipart/from-data; boundary=1265684                                          
 Content-Length: 345                                                                                          
                                                                                   <--------------empty line
-123456789                                                                  <----------------body
(more data)

//Строки между start line и empty line это http headers

POST, GET, PUT - методы и т.д описывают требуемое действие

По какому принципу заполнять заголовочные файлы(http headers)?

Нужно ли их все заполнять или достаочно только заполнить start line?
Или можно примерно сделать так (примерный код ниже)?

Код
C++ (Qt)
QString  http_start_line = "POST / HTTP/1.1";
QFile xml_file;
...
QByteArray ba_file = xml_file.readAll();
...
 
QByteArray buffer;
buffer.appent(http_start_line);
buffer.append(ba_file);
 
socket.write(buffer.data(), buffer.size());
 
12  Qt / XML / Re: xml-rpc : Май 20, 2022, 16:12
а сокет обязательно, обычным QNAM не обойтись? Улыбающийся по стандарту xml-rpc использует http транспорт, тебе придется формировать структуру запроса самому.

1) клиент формирует хмл с нужными данными и отправляет по сети
2) сервер парсит хмл, выполняет свою логику, отправляет хмл с результатом клиенту
3) клиент парсит хмл-результат

Да мне нужен QTcpSocket
Клиент и сервер я пишу сам на базе QTcpSocket

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

Я думал формируем xml-файл, отправляем(soket.write(...)), принимаем (socket.read(...)), парсим xml -файл

Или я не прав???
13  Qt / XML / Re: xml-rpc : Май 20, 2022, 10:48
все верно.

если одна сторона только отправляет запросы, а другая только принимает, то на отправляющей стороне в принципе можно формировать хмл документ ручками (если, например, для отправляющей стороны надо тащить отдельную библиотеку для обработки хмл).

Мне нужно используя QTcpSocket  сделать две прилажухи : клиент и сервер))

Со стороны клиента вводится два цифровых значения и операция которая производится: сложить, умножить, вычесть, разделить. Все это посылается на сервер и сервер выдает результат.

Все это нужно сделать при помощи xml-rpc.

 Я так понимаю что клиент формиует xml документ и передает файл по сити, сервер соответственно принимает его, парсит и выполняет нужную операцию с переданными данными.  Правильно я понимаю?
14  Qt / XML / Re: xml-rpc : Май 20, 2022, 08:16
Т.е получается со стороны клиента и со стороны сервера должен быть xml парсер, который из документа будет вынимать нужную инфу?
15  Qt / XML / xml-rpc : Май 19, 2022, 15:54
Всем, доброго дня!!!
Подскажите кто-нибудь работал с   xml-rpc?

Не могу понять запрос и ответ на запрос передаются между клиент-сервером xml- файлами?

Заранее прошу простить если спросил глупость.
Страниц: [1] 2 3 ... 65

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