powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt Как сделать всплывающую панельку в произвольном месте формы?
17 сообщений из 17, страница 1 из 1
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37318439
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробовал сделать форму унаследованную от QWidget - она появляется в левом верхнем углу вызвавшей формы и не реагирует на свойство geometry, а так, то что надо - заголовка нет, находится внутри вызвавшей формы и перемещается вместе с ней.

Попробовал от QFrame - получил самостоятельное окно, живущее свой жизнью - явно не то.

Как правильно?
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37318551
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QToolTip?
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37318668
ModulNET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymanovsky,

а приведите кодик, а люди поправят...
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37319218
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QToolTip, я так понял выводит только форматированный текст.

код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
void MainWindow::toolButtonConnectionSettings_clicked(){
    if (ui->toolButtonConnectionSettings->isChecked()){
        ui->toolButtonHexSettings->setChecked(false);
        ui->toolButtonComSettings->setChecked(false);
        ui->toolButtonTCPSettings->setChecked(false);
        QRect rect = connectionSettings->geometry();
        const QRect frameSettingsGeometry = ui->frameSettings->geometry();
        rect.setLeft(frameSettingsGeometry.left());
        rect.setTop(frameSettingsGeometry.top()+frameSettingsGeometry.height());
        connectionSettings->show();
    }
    else {
        connectionSettings->hide();
    }

}

Хочется чего-то вроде см. вложение. Только чтоб была видна только панель, без оконной рамки.
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37319309
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал, но хотелось бы привязку к окну и его координатам, а не к рабочему столу:
Код: plaintext
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.
connectionSettings = new ConnectionSettings(qobject_cast<QFrame*>(this),Qt::Popup);

//...

void MainWindow::toolButtonConnectionSettings_clicked(){
    if (ui->toolButtonConnectionSettings->isChecked()){       
        ui->toolButtonComSettings->setChecked(false);
        ui->toolButtonTCPSettings->setChecked(false);
        QRect rect = connectionSettings->geometry();
        const QRect frameSettingsGeometry = ui->frameSettings->geometry();        
        const QRect mainWindowGeometry = this->geometry();
        const QRect tabWidgetGeometry = ui->tabWidgetMainMenu->geometry();

        rect.setCoords(frameSettingsGeometry.left()+mainWindowGeometry.left(),
                tabWidgetGeometry.bottom()+mainWindowGeometry.top(),
                frameSettingsGeometry.right()+mainWindowGeometry.left(),
                tabWidgetGeometry.bottom()+rect.height()+mainWindowGeometry.top());        

        connectionSettings->setGeometry(rect);
        connectionSettings->show();
    }
    else {
        connectionSettings->hide();
    }

}
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37319441
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более-менее добился желаемого результата:

Код: plaintext
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.
connectionSettings = new ConnectionSettings(qobject_cast<QFrame*>(this),Qt::Widget);
//...

void MainWindow::toolButtonConnectionSettings_clicked(const bool checked){
    if (checked){
        placeSettingsWidget(connectionSettings);
        ui->toolButtonComSettings->setChecked(false);
        ui->toolButtonHexSettings->setChecked(false);
        ui->toolButtonTCPSettings->setChecked(false);
        connectionSettings->show();
    }
    else {
        connectionSettings->hide();
    }

}

void MainWindow::placeSettingWidget(QWidget *widget){
    QRect rect = widget->geometry();
    const QRect frameSettingsGeometry = ui->frameSettings->geometry();
    const QRect mainWindowGeometry = this->geometry();
    const QRect tabWidgetGeometry = ui->tabWidgetMainMenu->geometry();
    int height = rect.height();
    rect.setX(frameSettingsGeometry.left()+mainWindowGeometry.left());
    rect.setY(tabWidgetGeometry.bottom()+mainWindowGeometry.top());
    rect.setWidth(frameSettingsGeometry.width());
    rect.setHeight(height);
    widget->setGeometry(rect);
}

void MainWindow::moveEvent(QMoveEvent *event){
    if (connectionSettings->isVisible()){
        placeSettingWidget(connectionSettings);
    }
}
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37319558
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dymanovsky, а зачем ты при создании connectingSettings кастуешь this к QFrame? Хрустальный шар мне подсказывает, что и без каста он должен this принять спокойно
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37319832
Apple37
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое ребят, давно искал
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37319980
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь появилась другая проблема - когда родительское окно уходит на задний план, виджет остаётся поверх всех окон. Неужели и это надо прописывать вручную?
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320604
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понимаю что именно ты хочешь, то достаточно сделать самостоятельное окно (QWidget) с флагами setWindowFlags(Qt::Popup); Оно появится в левом-верхнем углу экрана и его можно будет сдвинуть.
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320782
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так я уже пробовал в начале.

Dymanovsky
Код: plaintext
connectionSettings = new ConnectionSettings(qobject_cast<QFrame*>(this),Qt::Popup);


Подумаю. Может верну. Qt::Popup при щелчке вне этого окна, сворачивании, разворачивании окна и пр. исчезает, а мой вариант висит пока не отожмут кнопочку или не нажмут соседнюю с другими настройками.
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320850
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymanovskyТак я уже пробовал в начале.

Dymanovsky
Код: plaintext
connectionSettings = new ConnectionSettings(qobject_cast<QFrame*>(this),Qt::Popup);


Подумаю. Может верну. Qt::Popup при щелчке вне этого окна, сворачивании, разворачивании окна и пр. исчезает, а мой вариант висит пока не отожмут кнопочку или не нажмут соседнюю с другими настройками.
На самом деле там все достаточно просто. Смотри аттач.
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320871
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Благодарю, но работает точно также, как в сообщении №5.
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320917
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymanovskyБлагодарю, но работает точно также, как в сообщении №5.ээээ.... А там какие-то страшные рассчеты и приведение типов зачем-то... :)
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320965
Dymanovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А страшные расчёты там потому, что в средах типа Borland'а и MS Visual Studio в основе линейных размеров компонента лежит длина и ширина. Если изменять там top и left она сохраняется, а объект перемещается. В Qt за основу берутся координаты левого верхнего угла и правого нижнего. Если изменить top и left, то right и bottom останутся на месте, поэтому их тоже надо пересчитывать. Я сначала сделал как в примере и не мог понять: почему если я задаю координаты вручную в недалеко от левого верхнего угла рабочего стола - окно появляется, но ущербное (компоненты не вписываются в его границы), а если там где надо, то не появляется вовсе. Потом добился появления окна в нужном месте, но при перемещении основной формы, перемещался только левая и верхняя граница всплывающего окна (левый верхний угол), а правый оставался на месте.

К тому же при Qt::Popup окно нельзя передвинуть, свернуть, развернуть, без автозакрытия всплывающего окна. Поэтому решил в пользу Qt::QWidget
...
Рейтинг: 0 / 0
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #37320974
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DymanovskyА страшные расчёты там потому, что в средах типа Borland'а и MS Visual Studio в основе линейных размеров компонента лежит длина и ширина. Если изменять там top и left она сохраняется, а объект перемещается. В Qt за основу берутся координаты левого верхнего угла и правого нижнего. Если изменить top и left, то right и bottom останутся на месте, поэтому их тоже надо пересчитывать. Я сначала сделал как в примере и не мог понять: почему если я задаю координаты вручную в недалеко от левого верхнего угла рабочего стола - окно появляется, но ущербное (компоненты не вписываются в его границы), а если там где надо, то не появляется вовсе. Потом добился появления окна в нужном месте, но при перемещении основной формы, перемещался только левая и верхняя граница всплывающего окна (левый верхний угол), а правый оставался на месте.ээээ... Ну опаньки. В Qt такие расчеты уже не нужны. В Qt для перемещения виджета (и любого потомка от виджета, в том числе и окна) достаточно запустить один метод move();

DymanovskyК тому же при Qt::Popup окно нельзя передвинуть, свернуть, развернуть, без автозакрытия всплывающего окна. Поэтому решил в пользу Qt::QWidgetВообще-то, Qt::Popup это всего-лишь флаг для Qt::QWidget... А вот зачем эти всплывающие окна таскать я не понял. Если я правильно понимаю твою дизайнерскую идею, то это должны быть "окна выпадающие из кнопки на тулбаре" так? Тогда их таскать не нужно и Qt::Popup самый подходящий флаг.
А если хочется окна с настройками таскать, то делай их на основе QDockWidget и сможешь их и таскать и накладывать друг на друга и вообще отрывать от главного окна приложения и запускать в свободное плаванье как отдельное окно. С док-окнами много чего можно вкусного делать.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Qt Как сделать всплывающую панельку в произвольном месте формы?
    #38257554
German Grekhov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlDymanovskyТак я уже пробовал в начале.

пропущено...


Подумаю. Может верну. Qt::Popup при щелчке вне этого окна, сворачивании, разворачивании окна и пр. исчезает, а мой вариант висит пока не отожмут кнопочку или не нажмут соседнюю с другими настройками.
На самом деле там все достаточно просто. Смотри аттач.

Спасибо за код! Одна поправка: лучше наследовать классы с popup не от QWidget, а от QFrame. Тогда всплывающие окошки лучше выглядят.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt Как сделать всплывающую панельку в произвольном месте формы?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]