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

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

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

а приведите кодик, а люди поправят...
...
Рейтинг: 0 / 0
22.06.2011, 08:39
    #37319218
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
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
22.06.2011, 09:30
    #37319309
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Сделал, но хотелось бы привязку к окну и его координатам, а не к рабочему столу:
Код: 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
22.06.2011, 10:28
    #37319441
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Более-менее добился желаемого результата:

Код: 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
22.06.2011, 11:19
    #37319558
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Dymanovsky, а зачем ты при создании connectingSettings кастуешь this к QFrame? Хрустальный шар мне подсказывает, что и без каста он должен this принять спокойно
...
Рейтинг: 0 / 0
22.06.2011, 12:55
    #37319832
Apple37
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Спасибо большое ребят, давно искал
...
Рейтинг: 0 / 0
22.06.2011, 13:59
    #37319980
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Теперь появилась другая проблема - когда родительское окно уходит на задний план, виджет остаётся поверх всех окон. Неужели и это надо прописывать вручную?
...
Рейтинг: 0 / 0
22.06.2011, 18:18
    #37320604
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Если я правильно понимаю что именно ты хочешь, то достаточно сделать самостоятельное окно (QWidget) с флагами setWindowFlags(Qt::Popup); Оно появится в левом-верхнем углу экрана и его можно будет сдвинуть.
...
Рейтинг: 0 / 0
22.06.2011, 20:44
    #37320782
Dymanovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
Так я уже пробовал в начале.

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


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

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


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

К тому же при Qt::Popup окно нельзя передвинуть, свернуть, развернуть, без автозакрытия всплывающего окна. Поэтому решил в пользу Qt::QWidget
...
Рейтинг: 0 / 0
23.06.2011, 00:45
    #37320974
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
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
Период между сообщениями больше года.
15.05.2013, 07:59
    #38257554
German Grekhov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt Как сделать всплывающую панельку в произвольном месте формы?
White OwlDymanovskyТак я уже пробовал в начале.

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


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

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


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