Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полосы прокрутки в QMainWindow 
V
    Опции темы
Ober
Дата 19.3.2012, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Извините за глупый вопрос, но ответ на него сам найти не могу. Можно ли в объекте класса, унаследованного от QMainWindow, установить полосы прокрутки и если можно, то как ?
PM MAIL   Вверх
bsa
Дата 19.3.2012, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Ober, можно. Для этого назначь QMdiArea как central widger и с ним разминайся
PM   Вверх
Ober
Дата 19.3.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 19.3.2012,  17:39)
Ober, можно. Для этого назначь QMdiArea как central widger и с ним разминайся

Этот класс я пока еще не изучал. Может есть способ это сделать с помощью QScrollArea. У меня класс унаследованный от QMainWindow, располагает в себе меню QMenu, на нем же я провожу рисование с помощью QPaint, но рисунок получается слишком большим, и часть его не отображается в моем окне. 

Это сообщение отредактировал(а) Ober - 19.3.2012, 17:56
PM MAIL   Вверх
bsa
Дата 19.3.2012, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Ober, ну воткни туда (setCentralWidget) нужного тебе наследника QWidget.
PM   Вверх
Ober
Дата 19.3.2012, 23:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 19.3.2012,  22:56)
Ober, ну воткни туда (setCentralWidget) нужного тебе наследника QWidget.

Ок попробую. У меня другая проблема возникла )). Странная проблема, в режиме дебага программа все правильно вырисовывает, но в режиме релиза получается ерунда, посмотрите в файле пожалуйста. Как такое может быть ? 

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Точечный_рисунок.JPG 197,68 Kb
PM MAIL   Вверх
bsa
Дата 20.3.2012, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



скорее всего, где-то у тебя используются неинициализированные переменные.
PM   Вверх
Ober
Дата 20.3.2012, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 20.3.2012,  11:09)
скорее всего, где-то у тебя используются неинициализированные переменные.

Нашел место, в котором возникает ошибка, но как ее устранить не могу понять. Вот фрагмент кода цикла for в котором переменная i  возрастает от нуля до 31 и в дебаге программа входит во все условия поочередно, а в релизе не входит во второе и в третье, хотя они выполняются.

Код

for( int i = 0; i < size; i++ )
      {
          if( i > 0 && i < 3 )
          {
            left.rx() += 480;
            painter.drawLine( topPoints[0], bottomPoints[i]);
          }

          if( i > 2 && i < 7 )
          {
            left.rx() += 240;
            if( i <= 4 )
            painter.drawLine( topPoints[1], bottomPoints[i]);
            else if( i > 4 )
            painter.drawLine( topPoints[2], bottomPoints[i]);
          }

          if( i > 6 && i < 15 )
          {
             left.rx() += 120;
             if( i <= 8 )
             painter.drawLine( topPoints[3], bottomPoints[i]);
             else if( i <= 10 )
             painter.drawLine( topPoints[4], bottomPoints[i]);
             else if( i <= 12 )
             painter.drawLine( topPoints[5], bottomPoints[i]);
             else if( i <= 14 )
             painter.drawLine( topPoints[6], bottomPoints[i]);
          }

          if( i > 14  )
          {
            if( i % 2 != 0  )
            {
            left.rx() += 60;
            left.ry() -= 70;
            }
          else if( i % 2 == 0 )
          {
            left.rx() += 60;
            left.ry() += 70;
          }

            if( i <= 16 )
            painter.drawLine( topPoints[7], bottomPoints[i]);
            else if( i <= 18 )
            painter.drawLine( topPoints[8], bottomPoints[i]);
            else if( i <= 20 )
            painter.drawLine( topPoints[9], bottomPoints[i]);
            else if( i <= 22 )
            painter.drawLine( topPoints[10], bottomPoints[i]);
            else if( i <= 24 )
            painter.drawLine( topPoints[11], bottomPoints[i]);
            else if( i <= 26 )
            painter.drawLine( topPoints[12], bottomPoints[i]);
            else if( i <= 28 )
            painter.drawLine( topPoints[13], bottomPoints[i]);
            else if( i <= 30 )
            painter.drawLine( topPoints[14], bottomPoints[i]);

           }

        }
      }


Это сообщение отредактировал(а) Ober - 20.3.2012, 22:18
PM MAIL   Вверх
bsa
Дата 20.3.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



А что такое left?
PM   Вверх
Ober
Дата 20.3.2012, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(bsa @ 20.3.2012,  22:34)
А что такое left?

Left - это точка левого верхнего угла прямоугольника. Но если бы дело было в не корректно отрисовывались бы все прямоугольники, а так только те которые заданы вторым и третьим условиями. Изменение координат Left - это перемещение прямоугольников.

В общем вот вся функция если есть желание можете просмотреть:

Код

void MainWindow::paintEvent( QPaintEvent * pe )
{
  if( !tempList.isEmpty() )
  {
    int size = tempList.size();
    QVector< QPoint > bottomPoints;
    QVector< QPoint > topPoints;

    QPainter painter( this );
    painter.setRenderHint( QPainter::Antialiasing, true );
    this->setGeometry(QRect( 10, 30, 1000, 700 ));
    this->setPalette( Qt::white );

    QPoint left = QPoint( 450, 640 );
    QPoint temp = left;

      for( int i = 0; i < size; i++ )
      {
          if( i == 1 )
          {
            left.rx() -= 230;
            left.ry() -= 120;
            temp = left;
          }

          if( i == 3 )
          {
             left.rx() = temp.x() - 120;
             left.ry() = temp.y() - 120;
             temp = left;
          }

          if( i == 7 )
          {
             left.rx() = temp.x() - 60;
             left.ry() = temp.y() - 120;
             temp = left;
          }

          if( i == 15 )
          {
            left.rx() = temp.x() - 30;
            left.ry() = temp.y() - 120;
          }

          topPoints.push_back( QPoint( left.x() + 35, left.y() ));
          bottomPoints.push_back( QPoint( left.x() + 35, left.y() + 50 ) );

          QRect drawElement( left.x(), left.y(), 70, 50 );
          painter.drawRect( drawElement );
          painter.drawText(QRect( left.x(), left.y(), 70, 50 ),
          " " + tempList[i]->getName() + "\n " +
          tempList[i]->getSurname() + "\n (" +
          tempList[i]->getBirthYear() + " - " + tempList[i]->getDeathYear() + ")");


          if( i > 0 && i < 3 )
          {
            left.rx() += 480;
            painter.drawLine( topPoints[0], bottomPoints[i]);
          }
          else if( i > 2 && i < 7 )
          {
            left.rx() += 240;
            if( i <= 4 )
            painter.drawLine( topPoints[1], bottomPoints[i]);
            else if( i > 4 )
            painter.drawLine( topPoints[2], bottomPoints[i]);
          }
          else
          if( i > 6 && i < 15 )
          {
             left.rx() += 120;
             if( i <= 8 )
             painter.drawLine( topPoints[3], bottomPoints[i]);
             else if( i <= 10 )
             painter.drawLine( topPoints[4], bottomPoints[i]);
             else if( i <= 12 )
                 painter.drawLine( topPoints[5], bottomPoints[i]);
             else if( i <= 14 )
                 painter.drawLine( topPoints[6], bottomPoints[i]);
          }
          else
          if( i > 14  )
          {
            if( i % 2 != 0  )
            {
            left.rx() += 60;
            left.ry() -= 70;
            }
          else if( i % 2 == 0 )
          {
            left.rx() += 60;
            left.ry() += 70;
          }

            if( i <= 16 )
            painter.drawLine( topPoints[7], bottomPoints[i]);
            else if( i <= 18 )
            painter.drawLine( topPoints[8], bottomPoints[i]);
            else if( i <= 20 )
            painter.drawLine( topPoints[9], bottomPoints[i]);
            else if( i <= 22 )
            painter.drawLine( topPoints[10], bottomPoints[i]);
            else if( i <= 24 )
            painter.drawLine( topPoints[11], bottomPoints[i]);
            else if( i <= 26 )
            painter.drawLine( topPoints[12], bottomPoints[i]);
            else if( i <= 28 )
            painter.drawLine( topPoints[13], bottomPoints[i]);
            else if( i <= 30 )
            painter.drawLine( topPoints[14], bottomPoints[i]);

           }

        }
      }
}


Это сообщение отредактировал(а) Ober - 20.3.2012, 22:43
PM MAIL   Вверх
bsa
Дата 20.3.2012, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



скажу сразу, мне код в принципе не нравится. так как очень много повторений, которые можно было бы сделать просто в цикле. Искать ошибки в таком коде сущее мучение.
PM   Вверх
Sality123
Дата 22.3.2012, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 121
Регистрация: 10.3.2011

Репутация: нет
Всего: нет



Как ты определил что программа в релизе не заходит в первое и второе условие? Она не может не заходить, там глупая логика.. она заходит а вот в нутри возникают проблемы.
PM MAIL   Вверх
math64
Дата 23.3.2012, 11:38 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Я тоже не стал бы так делать.
1. Вместо того, чтобы переопределять paintEvent в MainWindow, я бы сделал это в классе производном от QWidget в вставил бы его в качестве centralWidget в MainWindow. Если нужны полосы прокрутки - дополнительно добавил бы QScrollArea.
2.  Вызов setGeometry() внутри paintEvent() может привести к повторной перерисовке - лучше это сделать заранее, например, в конструкторе.
3. Возможно, topPoints и bottomPoints можно также вычислить заранее - paintEvent() желательно должен быть как можно проще, он вызывается всякий раз когда что-то нужно перерисовать (например, когда твоё окно откроется после закрытия другой программы)
Тогда их можно будет вывести через qDebug() и проверить, что они заполняются правильно.
PM   Вверх
Ober
Дата 23.3.2012, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 82
Регистрация: 11.3.2011

Репутация: нет
Всего: нет



Цитата(Sality123 @ 22.3.2012,  11:56)
Как ты определил что программа в релизе не заходит в первое и второе условие? Она не может не заходить, там глупая логика.. она заходит а вот в нутри возникают проблемы.

Да да, я уже разобрался, там действительно была проблема с логикой.

Добавлено через 1 минуту и 22 секунды
Цитата(math64 @ 23.3.2012,  11:38)
Я тоже не стал бы так делать.
1. Вместо того, чтобы переопределять paintEvent в MainWindow, я бы сделал это в классе производном от QWidget в вставил бы его в качестве centralWidget в MainWindow. Если нужны полосы прокрутки - дополнительно добавил бы QScrollArea.
2.  Вызов setGeometry() внутри paintEvent() может привести к повторной перерисовке - лучше это сделать заранее, например, в конструкторе.
3. Возможно, topPoints и bottomPoints можно также вычислить заранее - paintEvent() желательно должен быть как можно проще, он вызывается всякий раз когда что-то нужно перерисовать (например, когда твоё окно откроется после закрытия другой программы)
Тогда их можно будет вывести через qDebug() и проверить, что они заполняются правильно.

Math спасибо, буду пробовать переделывать.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.