С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632

Растягивание виджетов

05.06.2014, 21:33. Показов 6977. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

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

Есть несколько проблем.

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

Вторая - если какой-то стандартный способ изменить размеры QLineEdit, если ширина текста больше ширины виджета?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.06.2014, 21:33
Ответы с готовыми решениями:

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

Растягивание объектов QGridLayout
Здравствуйте! Подскажите можно-ли растягивать объекты в QGridLayout? Вот, например, мне нужно поставить QScrollBar и, соответсвенно,...

Выравнивание виджетов
Добрый день, хотелось бы понять, имеется QTAbWidget, внутри него QHBoxLayout, в него помещаются последовательно виджеты с...

9
 Аватар для alexey_rage
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
05.06.2014, 23:04
Цитата Сообщение от alexey31415 Посмотреть сообщение
Первая - как сделать, чтобы пользователь мог менять размеры виджета самостоятельно? То есть при наведении курсора на какой-то край виджета, курсор меняет свой вид и можно тянуть виджет.


Цитата Сообщение от alexey31415 Посмотреть сообщение
Вторая - если какой-то стандартный способ изменить размеры QLineEdit, если ширина текста больше ширины виджета?
Получить размеры строки в пикселях.
C++ (Qt)
1
2
3
4
5
    QFontMetrics fMetrics(font); // где font - текущий шрифт
    QString str = QString("Какой-то текст"); // Искомая строка
 
    int strWidth = fMetrics.width(str);    // Ширина строки
    int strHeight = fMetrics.height(str);  // Высота строки
Ну а дальше меняем размер QLineEdit на нужный.
0
Автор FAQ
 Аватар для Чистый
2733 / 1429 / 89
Регистрация: 08.09.2011
Сообщений: 3,746
Записей в блоге: 1
06.06.2014, 08:57
касательно первого, то у меня есть даже пример, буду на работе,выложу, реализовывал подобное
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
06.06.2014, 09:15  [ТС]
alexey_rage, вот что я имел ввиду
пример
0
 Аватар для alexey_rage
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
06.06.2014, 09:43
Цитата Сообщение от Чистый Посмотреть сообщение
касательно первого, то у меня есть даже пример, буду на работе,выложу, реализовывал подобное
Может я что-то не правильно понял? Виджет - это же обычное окно. Разве что-то нужно специально реализовывать, чтобы пользователь мог изменять его размеры? В каком месте я туплю?

Добавлено через 23 минуты
alexey31415, залейте файл на форум (это кстати в правилах написано), а то по ссылке у меня не открывается.
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
06.06.2014, 09:50  [ТС]
alexey_rage,
Миниатюры
Растягивание виджетов  
0
 Аватар для alexey_rage
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
06.06.2014, 09:55
alexey31415, это виджет внутри виджета что-ли? Или просто отдельное окно?
0
 Аватар для alexey31415
60 / 60 / 7
Регистрация: 16.05.2010
Сообщений: 632
06.06.2014, 11:24  [ТС]
alexey_rage, это пример.
Мне необходимо, чтобы можно было так же растянуть, например, виджет дерева или таблицы, или ComboBox'a.

Добавлено через 1 час 17 минут
Цитата Сообщение от alexey_rage Посмотреть сообщение
Получить размеры строки в пикселях.
хотелось бы такое делать в процессе ввода пользователем. Я понимаю, что можно добавить слот к сигналу textEdited, но вдруг есть стандартное решение.
0
 Аватар для alexey_rage
596 / 396 / 79
Регистрация: 23.10.2013
Сообщений: 1,143
06.06.2014, 12:13
Цитата Сообщение от alexey31415 Посмотреть сообщение
хотелось бы такое делать в процессе ввода пользователем. Я понимаю, что можно добавить слот к сигналу textEdited, но вдруг есть стандартное решение
Сомневаюсь, что есть стандартное решение.
По крайней мере я такого не знаю.
Скорее всего придется ручками делать.
Но может быть найдется на форуме кто-то, кто знает такое решение.
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
06.06.2014, 15:40
alexey31415, вот что то накидал, но по большому счету - это черновик - у ресайзимых виджетов должен быть родитель + я не отслеживаю ресайз по углам виджета, но логика думаю будет понятна из кода
mainwindow.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#pragma once
 
#include <QWidget>
 
class ResizableFilter: public QObject
{
    Q_OBJECT
public:
    ResizableFilter(QObject* parent = 0);
protected:
    bool eventFilter(QObject* watched, QEvent* event );
private:
    bool m_rightBorderResizeFlag;
    bool m_leftBorderResizeFlag;
    bool m_topBorderResizeFlag;
    bool m_bottomBorderResizeFlag;
};
 
class ResizableWidget : public QWidget
{
    Q_OBJECT
 
public:
    ResizableWidget(QWidget *parent = 0);
};
mainwindow.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include "mainwindow.h"
#include <QHBoxLayout>
#include <QPushButton>
#include <QComboBox>
#include <QMouseEvent>
 
ResizableWidget::ResizableWidget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton* pButton = new QPushButton("Push Button");
    QHBoxLayout* box = new QHBoxLayout;
 
    QComboBox* pCmBox = new QComboBox;
    pCmBox->addItems(QStringList() << "first" << "second" << "third");
 
    box->addWidget(pButton);
    box->addWidget(pCmBox);
    setLayout(box);
 
    ResizableFilter* filter = new ResizableFilter(this);
    pButton->installEventFilter(filter);
    pCmBox->installEventFilter(filter);
}
 
ResizableWidget::~ResizableWidget()
{
 
}
 
 
ResizableFilter::ResizableFilter(QObject* parent)
    : QObject(parent),
    m_rightBorderResizeFlag(false),
    m_leftBorderResizeFlag(false),
    m_topBorderResizeFlag(false),
    m_bottomBorderResizeFlag(false)
{
}
 
bool ResizableFilter::eventFilter(QObject* watched, QEvent* event )
{
    QWidget* watchedWgt = qobject_cast<QWidget*>(watched);
    watchedWgt->setMouseTracking(true);
    QMouseEvent* mEvent = static_cast<QMouseEvent*>(event);
    QRect wgtRect = watchedWgt->rect();
    const quint16 SENSIBLE_INDENT = 3;
    auto isRightBorderResizable = [&, this]()->bool
    {
        return mEvent->pos().x() <= (wgtRect.right() + SENSIBLE_INDENT) && mEvent->pos().x() >= (wgtRect.right() - SENSIBLE_INDENT); 
    };
    auto isLeftBorderResizable = [&, this]()->bool
    {
        return mEvent->pos().x() <= (wgtRect.left() + SENSIBLE_INDENT) && mEvent->pos().x() >= (wgtRect.left() - SENSIBLE_INDENT); 
    };
    auto isTopBorderResizable = [&, this]()->bool
    {
        return mEvent->pos().y() <= (wgtRect.top() + SENSIBLE_INDENT) && mEvent->pos().y() >= (wgtRect.top() - SENSIBLE_INDENT); 
    };
    auto isBottomBorderResizable = [&, this]()->bool
    {
        return mEvent->pos().y() <= (wgtRect.bottom() + SENSIBLE_INDENT) && mEvent->pos().y() >= (wgtRect.bottom() - SENSIBLE_INDENT); 
    };
 
    switch(event->type())
    {
    case QEvent::MouseButtonPress:
        {
            if(isRightBorderResizable())
            {
                m_rightBorderResizeFlag = true;
                return true;
            }
            else if(isLeftBorderResizable())
            {
                m_leftBorderResizeFlag = true;
                return true;
            }
            else if(isTopBorderResizable())
            {
                m_topBorderResizeFlag = true;
                return true;
            }
            else if(isBottomBorderResizable())
            {
                m_bottomBorderResizeFlag = true;
                return true;
            }
        }
        break;
 
    case QEvent::MouseButtonRelease:
        m_rightBorderResizeFlag = false;
        m_leftBorderResizeFlag = false;
        m_topBorderResizeFlag = false;
        m_bottomBorderResizeFlag = false;
        break;
 
    case QEvent::MouseMove:
        {
            if(isRightBorderResizable() || isLeftBorderResizable())
                watchedWgt->setCursor(Qt::SizeHorCursor);
            else if(isTopBorderResizable() || isBottomBorderResizable())
                watchedWgt->setCursor(Qt::SizeVerCursor);
            else
                watchedWgt->setCursor(Qt::ArrowCursor);
 
            QRect wgtGeometry = watchedWgt->geometry();
            if(m_rightBorderResizeFlag)
            {
                wgtGeometry.setWidth(mEvent->pos().x());
            }
            else if(m_leftBorderResizeFlag)
            {
                QPoint newPosition = watchedWgt->mapToParent(mEvent->pos());
                QPoint oldBottomRight = wgtGeometry.bottomRight();
                wgtGeometry.setX(newPosition.x());
                wgtGeometry.setBottomRight(oldBottomRight);
            }
            else if(m_topBorderResizeFlag)
            {
                QPoint newPosition = watchedWgt->mapToParent(mEvent->pos());
                QPoint oldBottomRight = wgtGeometry.bottomRight();
                wgtGeometry.setY(newPosition.y());
                wgtGeometry.setBottomRight(oldBottomRight);
            }
            else if(m_bottomBorderResizeFlag)
            {
                QPoint newPosition = watchedWgt->mapToParent(mEvent->pos());
                QPoint oldTopLeft = wgtGeometry.topLeft();
                wgtGeometry.setBottom(newPosition.y());
                wgtGeometry.setTopLeft(oldTopLeft);
            }
            watchedWgt->setGeometry(wgtGeometry);
        }
    }
    return QObject::eventFilter(watched, event);
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
#include "mainwindow.h"
#include <QtWidgets/QApplication>
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    ResizableWidget w;
    w.resize(300, 300);
    w.show();
    return a.exec();
}
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2014, 15:40
Помогаю со студенческими работами здесь

Удаление виджетов
Помогите пожалуйста,срочно нужно.В главном окне есть много разных виджетов(LineEdit,TextEdit,ComBobox,SpinBox,Label).В панели меню есть...

Отображение виджетов
Нужно накидать виджетов на форму, соединив их лейаутами, без дизайнера, не могу понять почему виджеты не отображаются.#include...

Компоновка виджетов
Доброго времени суток. Делаю приложение для диплома и тут появилась неприятность. Необходимо скомпоновать виджеты, так чтобы слева...

обновление виджетов
Подскажите как обновить виджет с Layout'том. Ну допустим QWidget win; QHBoxLayout *hBox = new QHBoxLayout; for (int i = 0; i &lt;...

Раздвижение виджетов [Qt/C++]
Приветсвую всех:)! Вот такой у меня возник вопрос: как сделать раздвижение(т.е. с помощью полоски двигать) двух виджетов. P.S у меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru