Просмотр сообщений
|
Страниц: [1] 2 3 ... 65
|
1
|
Qt / Общие вопросы / Re: Проблема с подключением DLL на VS и QtCreator
|
: Октябрь 25, 2024, 09:48
|
правда это на другой машине и там нету VS ну если там используется не тот же компилятор (msvc toolset), которым ты собрал библиотеку, то чему ты удивляешься. Видимо, мы должны сами угадать какой у тебя компилятор используется на другой машине. Извините что сразу не уточнил Да в студии используется стандартный компилятор(msvc toolset), а в Qt MinGW32bit Т.е получается, что библа используемая в проекте должна быть собрана тем же компилятором что и сам проект иначе никак. Я правильно понимаю? Может можно как-то настроить?
|
|
|
2
|
Qt / Общие вопросы / Проблема с подключением DLL на VS и QtCreator
|
: Октябрь 24, 2024, 22:31
|
Доброго времени суток! Имеется библиотека созданная в VS2022 Типа: example.h #pragma once
#ifdef EXAMPLE_EXPORTS #define EXAMPLE_API __declspec(dllexport) #else #define EXAMPLE_API __declspec(dllimport) #endif
EXAMPLE_API void Get_Example();
example.cpp #include "pch.h" #include "example.h" #include <iostream>
void Get_Example() { std::cout << "hello example\n"; }
Если я подключаю данную библиотеку к проекту на VS то все хорошо и работает. Если же к проекту на Qt (правда это на другой машине и там нету VS) то не работает выдается ошибка undefined reference to -Z..Get_Example..
В pro-файле указываю путь к .h и .lib - файлам INCLUDEPATH += "C:\path" LIBS += "C:\path\name.lib"
Но если в хедере библиотеки сделать ...
extern "C"{ EXAMPLE_API void Get_Example(); }
пересобрать и подключить к Qt проекту то все норм. Пытался сделать в .pro файле Qt проекта добавить дефайн DEFINES += EXAMPLE_EXPORTS
Но безуспешно( Кто-нибудь сталкивался с такой проблемой? Подскажите в чем может быть причина?
|
|
|
3
|
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); }
то все норм событие орабатывается нормально! Подскажите что делаю не так???
|
|
|
5
|
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 не центрировал изображение, а размещал его в левом верхнем углу области просмотра?
|
|
|
6
|
Программирование / Python / Парсинг doc, docx файлов
|
: Июнь 22, 2022, 17:48
|
Всем доброго дня! Прошу заранее прощения если задам глупый вопрос Я в python полный нУль Мне нужно распарсить docx файл, в котором находятся таблицы(в ячейках таблицы как может быть инфа так может быть и пусто). Подскажите пожалуйста в каком направлении мне копать? Было бы круто если привели какой-нибудь example Спасибо!
|
|
|
7
|
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; }
|
|
|
8
|
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); }
|
|
|
10
|
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)
Подскажите что делаю не так???
|
|
|
11
|
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??? Я так понимаю
|
|
|
12
|
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()); }
Хотелось уточнить, считается ли это нормальной практикой и можно ли так делать как в вышеприведенном коде?
|
|
|
13
|
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());
|
|
|
14
|
Qt / XML / Re: xml-rpc
|
: Май 20, 2022, 16:12
|
а сокет обязательно, обычным QNAM не обойтись? по стандарту xml-rpc использует http транспорт, тебе придется формировать структуру запроса самому. 1) клиент формирует хмл с нужными данными и отправляет по сети 2) сервер парсит хмл, выполняет свою логику, отправляет хмл с результатом клиенту 3) клиент парсит хмл-результат Да мне нужен QTcpSocket Клиент и сервер я пишу сам на базе QTcpSocket А что значит формировать структуру запроса самому, можно поподробнее для особоодаренных... Я думал формируем xml-файл, отправляем(soket.write(...)), принимаем (socket.read(...)), парсим xml -файл Или я не прав???
|
|
|
15
|
Qt / XML / Re: xml-rpc
|
: Май 20, 2022, 10:48
|
все верно.
если одна сторона только отправляет запросы, а другая только принимает, то на отправляющей стороне в принципе можно формировать хмл документ ручками (если, например, для отправляющей стороны надо тащить отдельную библиотеку для обработки хмл).
Мне нужно используя QTcpSocket сделать две прилажухи : клиент и сервер)) Со стороны клиента вводится два цифровых значения и операция которая производится: сложить, умножить, вычесть, разделить. Все это посылается на сервер и сервер выдает результат. Все это нужно сделать при помощи xml-rpc. Я так понимаю что клиент формиует xml документ и передает файл по сити, сервер соответственно принимает его, парсит и выполняет нужную операцию с переданными данными. Правильно я понимаю?
|
|
|
|
|