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

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

05.06.2014, 21:33. Показов 6968. Ответов 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
Ответ Создать тему
Новые блоги и статьи
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. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru