Просмотр сообщений
|
Страниц: [1]
|
1
|
Qt / 2D и 3D графика / Большой размер сцены и drawText
|
: Январь 23, 2020, 14:13
|
Здравствуйте. Если установить размеры сцены 33554432 х 33554432, то при вызове функции QPainter::drawText(rect, flag, "xxx") текст рисуется в любой части сцены. Если установить размеры сцены 67108864 х 67108864, т.е. увеличить в два раза по ширине и высоте, то при вызове функции QPainter::drawText(rect, flag, "xxx") текст рисуется ТОЛЬКО в первой четверти части сцены. На остальной части сцены текст не выводится, хотя рисование линий и прочих графических элементов выполняется нормально (drawLine, drawRect). Подскажите, пожалуйста, в чём дело? Некорректные размеры сцены (есть ограничения), ошибка QT или моя ошибка? Спасибо.
|
|
|
3
|
Qt / Общие вопросы / Положение QToolBar
|
: Май 06, 2014, 17:05
|
Здравствуйте. Подскажите, пожалуйста, можно ли программно определить к какой стороне главного прикреплена панель QToolBar ? Спасибо.
|
|
|
4
|
Qt / 2D и 3D графика / Сигнал changed в QGraphicsScene
|
: Декабрь 08, 2013, 19:54
|
Здравствуйте. Имеется сцена. На ней расположены QGraphicsItem'ы. Отрисовка сцены выполняется в PaintEvent(QPaintEvent * event). Если установить соединение с сигналом QGraphicsScene->changed(const QList<QRectF> & region), то при удалении со сцены QGraphicsItem выполняется отрисовка всей видимой части сцены - значение области рисования передается в PaintEvent в параметре event->rect(). А в слот, который соединен с сигналом приходит один прямоугольник размером со сцену. Если убрать соединение с сигналом QGraphicsScene->changed, то в PaintEvent приходит размер обновления области сцены, равный размеру удаляемого QGraphicsItem'а. Причем, при добавлении QGraphicsItem'а на сцену при соединенном сигнале, обновление выполняется для области QGraphicsItem'а с соединенным сигналом или нет.
Можно ли как-нибудь сделать, чтобы и при удалении QGraphicsItem'а с установленным сигналом, обновлялась только область сцены под QGraphicsItem'ом ? Возможно, надо установить какие-нибудь параметры для сцены?
В качестве образца проблемы взят пример из OT - examples\graphicsview\diagramscene. Добавлен код в diagramscene.cpp: DiagramView::DiagramView(QWidget *parent): QGraphicsView(parent) { }; void DiagramView::paintEvent(QPaintEvent * event) { QRect rect1 = event->rect(); qDebug() << "paintEvent" << rect1; QGraphicsView::paintEvent(event); } Добавлен код в diagramscene.h: class DiagramView : public QGraphicsView { Q_OBJECT public: DiagramView(QWidget *parent = 0); private: void paintEvent(QPaintEvent * event); };
Добавлен код в mainwindow.cpp в функцию MainWindow::MainWindow(): view = new DiagramView(this); view->setScene(scene); connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(changeScene(QList<QRectF>)));
и void MainWindow::changeScene(QList<QRectF> rects) { qDebug() << "" << rects; }
и соответственно в mainwindow.h
Проблема в строке connect(scene, SIGNAL(changed(QList<QRectF>)), this, SLOT(changeScene(QList<QRectF>)));
QT 4.7
Спасибо.
|
|
|
5
|
Qt / 2D и 3D графика / Re: Проблема при обновлении сцены
|
: Апрель 28, 2013, 23:08
|
Не понятно, причем здесь эти функции. Последовательность операций следующая: 1. Текущий размер объекта rOld 2. Вычисляю новый размер объекта QRect rNew = QRect(x, y, w, h). rNew меньше rOld 3. Изменяю значение размера объекта функцией setRect(rNew) 4. Получаю событие paintEvent с прямоугольником перерисовки rNew 5. При обработки события paintEvent обновляю фон в области rNew, но оставшаяся часть rOld не обновляется, как бы я не расширял область обновления в в методе paintEvent
Вот в чем дело
|
|
|
6
|
Qt / 2D и 3D графика / Проблема при обновлении сцены
|
: Апрель 28, 2013, 20:47
|
Здравствуйте.
Имеется QGraphicsScene и QGraphicsView для отображения сцены. Это сторонние классы. На основе класса отображения создал свой класс и размещаю на сцене свои графические объекты, в том числе и графические стандартные, типа QGraphicsRectItem и т.д.
Вывод своих графических объектов осуществляю в обработке метода paintEvent.
Рисование проходит нормально и правильно при нанесении объектов и при обновлении всего viewport. Но, если изменить размеры (положение) графического объекта, то в метод paintEvent приходит событие, в котором указывается область изменения сцены, равной новому размеру (положению) объекта, а область, где ранее находился объект, не изменяется, т.е. остается "след" этого объекта.
Попытка изменить область перерисовки в методе paintEvent ни к чему не приводит.
Как быть в этом случае? Может быть есть другие методы, которые надо обрабатывать в такой ситуации? Подскажите, пожалуйста.
Спасибо.
|
|
|
8
|
Qt / 2D и 3D графика / Re: Перекрытие элементов в QPainterPath
|
: Декабрь 06, 2012, 14:58
|
Показываю скриншоты (по порядку). 1. Исходный код примера - значение параметра fillRule = OddEvenFill. Во втором и третьем ряду третья колонка наблюдается "дыра" в месте перекрытия элементов.
2. Исходный код примера - значение параметра fillRule = WindingFill. Во втором и третьем ряду третья колонка наблюдается отсутствие "дыр" в месте перекрытия элементов.
3. Модифицированный код примера - строки groupPath.moveTo(60.0, 40.0); groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0); заменил на строку groupPath.addEllipse(20, 20, 40, 40); Изменения касаются третьего элемента во второй строке. Значение параметра fillRule = OddEvenFill. Во втором и третьем ряду третья колонка наблюдается "дыра" в месте перекрытия элементов.
4. Модифицированный код примера. Значение параметра fillRule = WindingFill. Во втором ряду третья колонка "дыра" осталась. В третьем ряду третья колонка "дыра"отсутствует.
Windows XP, QT 4.7
|
|
|
9
|
Qt / 2D и 3D графика / Перекрытие элементов в QPainterPath
|
: Декабрь 05, 2012, 08:13
|
Здравствуйте.
На QPainterPath добавляю несколько элементов. Иногда они могут пересекаться. Чтобы общая область так же была прорисована устанавливаю для QPainterPath значение setFillRule в значение Qt::WindingFill. Все вроде работает.
Возьмем пример из Qt PainterPath в Examples. Все работает, как написано, но если заменить строчки
groupPath.moveTo(60.0, 40.0); groupPath.arcTo(20.0, 20.0, 40.0, 40.0, 0.0, 360.0);
на строку
groupPath.addEllipse(20, 20, 40, 40);
После замены строк значение setFillRule(Qt::WindingFill) не работает - в месте пересечения элементов остается "дырка"
В чем здесь дело - разобраться не могу.
Помогите. Заранее спасибо.
|
|
|
11
|
Qt / Пользовательский интерфейс (GUI) / Re: Прием пользовательских сообщений
|
: Апрель 17, 2011, 21:29
|
Нет. Эта функция из библиотеки стороннего разработчика. Поэтому ее функционал надо принимать так как есть.
Вообще-то, как мне думается, это должен быть стандартным вопросом для Windows.
В Windows все основано на передаче и приеме сообщений от мыши, клавиатуры, другого окна и т.д. Qt при работе в Windows должна принимать и передавать эти сообщения сообщения.
Как мне кажется, для отправки сообщения можно использовать функции sendEvent и postEvent. А где они принимаются?
Я в Qt новичок., поэтому этот вопрос.
|
|
|
12
|
Qt / Пользовательский интерфейс (GUI) / Re: Прием пользовательских сообщений
|
: Апрель 17, 2011, 18:49
|
Вот код:
Сначала заголовочный файл:
.............................................................. class hwnMessage : public QObject { Q_OBJECT
protected: bool eventFilter(QObject *obj, QEvent *event); };
class dlg_AtlasCre : public QDialog { Q_OBJECT
public: explicit dlg_AtlasCre(QWidget *parent = 0); ~dlg_AtlasCre(); bool event(QEvent * event); void customevent(QEvent * event);
public slots: void close(); void CreateClick(); void HelpClick(); void UpdateBtns();
private: xmlMapsDB * MapsDB;
QLabel * Label1; QTableWidget * Regions; QLabel * Label2; QTableWidget * WorkArea; QPushButton * CreateBtn; QPushButton * HelpBtn; QPushButton * CloseBtn; QLineEdit * LE; QProgressBar * PB; QFileInfoList listSxf;
void closeEvent(QCloseEvent *event);
}; #endif // DLG_ATLASCRE_H
Теперь реализация в части касающейся:
dlg_AtlasCre::dlg_AtlasCre(QWidget *parent) : QDialog(parent) { ....................................................... //Это регистрация пользовательского сообщения 0х585 int n1413 = QEvent::registerEventType(1413); qDebug() << "13=" <<n1413; //установка фильтра hwnMessage * hw = new hwnMessage(); this->installEventFilter(hw); ........................................................................ }
//фильтр сообщений bool hwnMessage::eventFilter(QObject *obj, QEvent *event) { qDebug() << "hwnMessage::eventFilter" << event->type(); return QObject::eventFilter(obj, event); }
//прием своих сообщений bool dlg_AtlasCre::event(QEvent * event) { qDebug() << "event=" << event->type(); QDialog::event(event); }
//прием своих сообщений void dlg_AtlasCre::customevent(QEvent * event) { qDebug() << "customevent=" << event->type(); dlg_AtlasCre::customevent(event); }
void dlg_AtlasCre::CreateClick() { ............................................ //вызов функции из библиотеки, в качестве одного из параметров передаю дескриптор этого окна //в процессе работы функции она шлет сообщения с идентификатором 0х585 в окно с переданным дескриптором qDebug() << "winId =" << this->winId(); long int res = LoadDirToMap(str1.constData(), str2.constData(), (long int)this->winId());// (MSGHANDLER)MessageHandler_LoadDir); ......................................................... }
в customEvent сообщения вообще не приходят в event и в фильтр сообщения приходят, но не то которое нужно
Далее - отладочная информация на консоли winId = 0x53039c - идентификатор окна hwnMessage::eventFilter 68 event= 68 hwnMessage::eventFilter 71 event= 71 hwnMessage::eventFilter 71 event= 71 hwnMessage::eventFilter 71 event= 71 hwnMessage::eventFilter 71 event= 71 hwnMessage::eventFilter 67 event= 67 hwnMessage::eventFilter 77 event= 77 hwnMessage::eventFilter 12 event= 12 hwnMessage::eventFilter 173 event= 173 hwnMessage::eventFilter 10 event= 10 hwnMessage::eventFilter 77 event= 77 hwnMessage::eventFilter 12 event= 12 hwnMessage::eventFilter 11 event= 11 hwnMessage::eventFilter 173 event= 173 hwnMessage::eventFilter 77 event= 77 hwnMessage::eventFilter 12 event= 12 hwnMessage::eventFilter 25 event= 25 hwnMessage::eventFilter 99 event= 99 hwnMessage::eventFilter 77 event= 77 hwnMessage::eventFilter 12 event= 12 hwnMessage::eventFilter 12 event= 12
Отправку сообщений и идентификатор окна проверил с помощью SpyXX - все соответсвует
|
|
|
14
|
Qt / Пользовательский интерфейс (GUI) / Прием пользовательских сообщений
|
: Апрель 17, 2011, 13:30
|
Здравствуйте.
Программа на С++ с использованием QT 4.7. Пока работает под Windows.
В программе я вызываю библиотечную функцию, в которую в качестве параметра передаю дескриптор окна. При работе библиотечная функция посылает этому окну пользовательское сообщение.
Каким образом я могу принять это сообщение в окне и обработать его?
Использование Event и customEvent в окне, которое должно принять сообщение, успеха не принесло.
Спасибо.
|
|
|
|
|