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

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QResizeEvent  (Прочитано 7216 раз)
Novicheck
Гость
« : Май 25, 2015, 15:52 »

всем привет, возникла следующая проблема - при выводе окна в минимальном размере все на своих местах, а как только изменяю размер, resizeEvent перерисовывает координаты уже относительно mainLabel, подскажите пожалуйста в чем косяк.
Код:
#include "map.h"
#include <QTextCodec>
#include <QResizeEvent>
#include <QDebug>

map::map(QWidget *parent)
    : QWidget(parent)
{

}

/*! главная форма */
void map::iniMap()
{
    QTextCodec *codec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(codec);
    setWindowTitle(tr("Карта доступности приемных"));
    setMinimumSize(1100, 687);

    verticalLayout = new QVBoxLayout();

    QFont font;
    font.setPointSize(12);
    font.setBold(true);
    font.setWeight(75);

    headerLabel = new QLabel;
    headerLabel->setText(tr("КАРТА ДОСТУПНОСТИ ПРИЕМНЫХ"));
    headerLabel->setFont(font);
    headerLabel->setAlignment(Qt::AlignCenter);
    headerLabel->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);

    mainLabel = new QLabel;
    mainLabel->setPixmap(QPixmap::fromImage(QImage("map_cr2.png")));
    mainLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    mainLabel->setScaledContents(true);

    pushButtonBack = new QPushButton(this);
    pushButtonBack->setText(tr("<< Назад"));
    pushButtonBack->setFont(font);
    pushButtonBack->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum);

    verticalLayout->addWidget(headerLabel);
    verticalLayout->addWidget(mainLabel);
    verticalLayout->addWidget(pushButtonBack);

    setLayout(verticalLayout);

    settings = new QSettings("data_map.ini", QSettings::IniFormat);
    QTextCodec *codec_ini = QTextCodec::codecForName("CP1251");
    settings->setIniCodec(codec_ini);

    pushButtonSpb = new QPushButton(this);
    pushButtonMsc = new QPushButton(this);
    pushButtonSev = new QPushButton(this);
    pushButtonKalin = new QPushButton(this);
    pushButtonMurm = new QPushButton(this);
    pushButtonRost = new QPushButton(this);
    pushButtonEkb = new QPushButton(this);
    pushButtonHabar = new QPushButton(this);
    pushButtonVlad = new QPushButton(this);

//    QWidgetList widgetList;
//    widgetList << pushButtonSpb << pushButtonMsc << pushButtonSev << pushButtonKalin << pushButtonMurm
//               << pushButtonRost << pushButtonEkb << pushButtonHabar << pushButtonVlad;
//    for (int i = 0; i < widgetList.size(); ++i)
//    {
//     widgetList[i]->setStyleSheet("QPushButton {border: none}");
//    }

    connect(pushButtonSpb, SIGNAL(clicked()), SLOT(MessageSpb()));
    connect(pushButtonMsc, SIGNAL(clicked()), SLOT(MessageMsc()));
    connect(pushButtonSev, SIGNAL(clicked()), SLOT(MessageSev()));
    connect(pushButtonKalin, SIGNAL(clicked()), SLOT(MessageKalin()));
    connect(pushButtonMurm, SIGNAL(clicked()), SLOT(MessageMurm()));
    connect(pushButtonRost, SIGNAL(clicked()), SLOT(MessageRost()));
    connect(pushButtonEkb, SIGNAL(clicked()), SLOT(MessageEkb()));
    connect(pushButtonHabar, SIGNAL(clicked()), SLOT(MessageHabar()));
    connect(pushButtonVlad, SIGNAL(clicked()), SLOT(MessageVlad()));
    connect(pushButtonBack, SIGNAL(clicked()), this, SLOT(OnClose()));

    show();
}

void map::resizeEvent(QResizeEvent *e)
{
    double W = width();
    double mW = minimumWidth();
    double extraW = W / mW;
    double H = height();
    double mH = minimumHeight();
    double extraH = H / mH;

    pushButtonSpb->setGeometry(170 * extraW, 212 * extraH, 250 * extraW, 39 * extraH);
    pushButtonMsc->setGeometry(255 * extraW, 270 * extraH, 220 * extraW, 45 * extraH);
    pushButtonSev->setGeometry(15 * extraW, 308 * extraH, 237 * extraW, 40 * extraH);
    pushButtonKalin->setGeometry(73 * extraW, 156 * extraH, 240 * extraW, 40 * extraH);
    pushButtonMurm->setGeometry(245 * extraW, 104 * extraH, 240 * extraW, 40 * extraH);
    pushButtonRost->setGeometry(190 * extraW, 370 * extraH, 236 * extraW, 38 * extraH);
    pushButtonEkb->setGeometry(376 * extraW, 439 * extraH, 241 * extraW, 37 * extraH);
    pushButtonHabar->setGeometry(757 * extraW, 483 * extraH, 255 * extraW, 42 * extraH);
    pushButtonVlad->setGeometry(840 * extraW, 591 * extraH, 240 * extraW, 40 * extraH);

    qDebug() << mainLabel->geometry();
    qDebug() << W << H << extraW << extraH;
}
Записан
Novicheck
Гость
« Ответ #1 : Май 25, 2015, 15:56 »

до ресайза
Записан
Novicheck
Гость
« Ответ #2 : Май 25, 2015, 15:58 »

после
Записан
Bepec
Гость
« Ответ #3 : Май 25, 2015, 18:24 »

Явно видно, что вы не учитываете размеры самих кнопок. В общем ошибка где то в ваших расчётах.

Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 26, 2015, 07:38 »

Попробуйте так
Код
C++ (Qt)
void map::resizeEvent(QResizeEvent *e)
{
   double W = e->size().width();
   double mW = minimumWidth();
   double extraW = W / mW;
   double H = e->size().height();
...
 
Записан
Novicheck
Гость
« Ответ #5 : Май 26, 2015, 09:23 »

Верес, я вижу что это смещение координат происходит ровно на размеры верхнего и нижнего виджетов, т.к. когда я их убираю - масштабирование происходит идеально - координаты кнопок пересчитываются идеально, а при установке верхнего лэйбла и нижней "Назад" пересчет рушится, и я бы рад их учесть, но не пойму как - потому что не ясно почему при первоначальной установке координаты принимаются от 0, 0, а при перерисовке меняются с учетом верхнего и нижнего виджетов.
я и относительно картинки пробовал пересчитывать, и тоже самое, результат тот же - сдвиг координат при ресайзе.
Igors, спасибо, но не помогло - результат тот же
Записан
Bepec
Гость
« Ответ #6 : Май 26, 2015, 12:07 »

Хм.

Честно, немного не пойму логику.
Вы берёте данные от mainWindow, ширину высоту, и на основании их вы делаете ресайз виджетов.
Когда на деле нужно брать данные от label.

Вот и вся ошибка как бы.

Как бы у вас цель - чтобы кнопульки были на местах на LABEL с рисунком. Т.е. ваша система координат должна идти от LABEL, а не от MainWindow.

PS если неверно понял, то поправьте.

PPS если не угадал, давайте проект минимальный и бум ковырять. А то разговор какой то получается безрезультатный.
« Последнее редактирование: Май 26, 2015, 12:17 от Bepec » Записан
Novicheck
Гость
« Ответ #7 : Май 26, 2015, 13:39 »

дак я и говорю что первоначально я и рисовал координаты от лейбла, и результат при перерисовке был тот же самый что и при использовании общих координат всего mainWindow...
исходники прилагаю
Записан
Bepec
Гость
« Ответ #8 : Май 26, 2015, 13:59 »

Чтото ваш проект отличается от первоначального. Так что непонятно чего вы хотите достичь Улыбающийся
Записан
Novicheck
Гость
« Ответ #9 : Май 26, 2015, 14:16 »

пардон, не та сборка... цель - кнопки должны перекрывать надписи
Записан
Bepec
Гость
« Ответ #10 : Май 26, 2015, 14:53 »

Перекрывать - всмысле полностью закрывать?

PS если не секрет, то зачем?
Записан
Novicheck
Гость
« Ответ #11 : Май 26, 2015, 15:13 »

закрывать. потом 3 закомментированными строками кнопки делаются невидимыми и при клике выводят инфосообщения, цепляющиеся из .ini файла
вот такая мудреность
Записан
Novicheck
Гость
« Ответ #12 : Май 26, 2015, 15:15 »

по сути это просто пример одного из модулей полноценной программы...
вроде уже готовый, но этот косяк с ресайзом не дает покоя
Записан
Bepec
Гость
« Ответ #13 : Май 26, 2015, 16:44 »

1) кривые измерения. Например тот же мурманск, аж на 4 пикселя ошибка Веселый
2) как я и сказал, вы берёте размеры окна. ОКНА. Не видимой области, не подвластной вам области, а окна в целом.
А окно имеет свойство меняться и подчиняется оно ОС. Те же бордюры к примеру в полномасштабном режиме занимают 11 px, в оконном 18 px. В результате эти неподвластные вам размеры и портят всю картину.

А цеплять надо именно размер QLabel. Той области, которой вы оперируете. Самый простой на мой взгляд вариант отнаследоваться от Label и реализовать свой функционал.
Записан
Novicheck
Гость
« Ответ #14 : Май 26, 2015, 16:54 »

кривость это да, не придавал этому значение потому как повторюсь это лишь пример - доказательство возможности реализации идеи (в моем случае немного кривое доказательство Смеющийся )
спасибо за совет, буду пробовать, но мое понимание технологии наследования подсказывает что это не прокатит
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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