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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [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 или моя ошибка?
Спасибо.
2  Qt / Общие вопросы / Re: Положение QToolBar : Май 07, 2014, 07:45
Да, именно это и надо.
Спасибо.
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 ни к чему не приводит.

Как быть в этом случае? Может быть есть другие методы, которые надо обрабатывать в такой ситуации?
Подскажите, пожалуйста.

Спасибо.
7  Qt / 2D и 3D графика / Re: Перекрытие элементов в QPainterPath : Декабрь 06, 2012, 17:26
Спасибо
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) не работает - в месте пересечения элементов остается "дырка"

В чем здесь дело - разобраться не могу.

Помогите.
Заранее спасибо.
10  Qt / Пользовательский интерфейс (GUI) / Re: Прием пользовательских сообщений : Апрель 18, 2011, 12:59
Большое спасибо Drafter.

Именно то, что мне и надо.

Использую функцию
bool QWidget::winEvent ( MSG * message, long * result )   [virtual protected]

Все замечания по тексту так же оказались правильные.

Еще раз спасибо.

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 - все соответсвует
13  Qt / Пользовательский интерфейс (GUI) / Re: Прием пользовательских сообщений : Апрель 17, 2011, 17:18
Сейчас попробовал.
Эффекта нет.
14  Qt / Пользовательский интерфейс (GUI) / Прием пользовательских сообщений : Апрель 17, 2011, 13:30
Здравствуйте.

Программа на С++ с использованием QT 4.7. Пока работает под Windows.

В программе я вызываю библиотечную функцию, в которую в качестве параметра передаю дескриптор окна.
При работе библиотечная функция посылает этому окну пользовательское сообщение.

Каким образом я могу принять это сообщение в окне и обработать его?

Использование Event и customEvent в окне, которое должно принять сообщение, успеха не принесло.

Спасибо.
Страниц: [1]

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