Russian Qt Forum
Апрель 26, 2024, 20:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Расположение Popup под кнопкой.  (Прочитано 4162 раз)
KlimichKartorgnusov
Гость
« : Май 23, 2016, 13:59 »

Здравствуйте.
Делаю popup виджет который, вызывается нажатием на кнопку и появляется под этой же кнопкой. Не могу понять как разместить его именно под кнопкой. При нажатии на кнопку, он появляется где то в левом верхнем углу, плюс-минус 10 см, но стоит мне развернуть окно во всю ширину экрана, как popup начинает правильно отображаться под кнопкой. Как правильно разместить popup? В замешательстве

Класс Popup виджета
Код:
class LookupView : public QWidget
{
    Q_OBJECT
public:
    explicit LookupView(QWidget *parent = 0) : QWidget(parent)
    {
        searchEdit_ = new QLineEdit(this);
        searchEdit_->setPlaceholderText("Поиск");

        QFrame* separator = new QFrame(this);
        separator->setFrameShape(QFrame::HLine);
        separator->setFrameShadow(QFrame::Sunken);

        listView_ = new QListView(this);

        QVBoxLayout *mainLayout = new QVBoxLayout;
        mainLayout->addWidget(searchEdit_);
        mainLayout->addWidget(separator);
        mainLayout->addWidget(listView_);
        mainLayout->setContentsMargins(0, 0, 0, 0);
        mainLayout->setSpacing(0);

        setWindowFlags(Qt::Popup);
        setLayout(mainLayout);
    }

private:
    QLineEdit *searchEdit_;
    QListView *listView_;
};

Класс кнопки в который включается класс Popup виджет
Код:
class LookupBox : public QPushButton
{
    Q_OBJECT
public:
    explicit LookupBox(QWidget *parent = 0) : QPushButton(parent)
    {
        lookupView_ = new LookupView;
        lookupView_->setParent(this, Qt::Popup);
        lookupView_->setVisible(false);

        connect(this, &LookupBox::clicked, this, &LookupBox::onClick);
        setContentsMargins(0, 0, 0, 0);
    }

private slots:
    //По нажатию на кнопку отработает этот слот
    void  onClick()
    {
        if(!lookupView_->isVisible()) {
            lookupView_->setGeometry(this->rect());
            lookupView_->move(this->x(), this->y() + this->height() * 2);
            lookupView_->setVisible(true);
        } else {
            lookupView_->setVisible(false);
        }
    }

private:
    LookupView *lookupView_;
};

main.cpp
Код:
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    LookupBox *locationEditDialog = new LookupBox;
    locationEditDialog->setText("Бокс с представлением");

    QVBoxLayout *layout = new QVBoxLayout;
    layout->addWidget(locationEditDialog);

    QWidget *widget = new QWidget;
    widget->setLayout(layout);
    widget->show();

    return a.exec();
}
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Май 23, 2016, 14:02 »

Чем не устроил QToolButton с menu() ?
Записан

Qt 5.11/4.8.7 (X11/Win)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #2 : Май 23, 2016, 14:37 »

Потому что

lookupView_->move(this->x(), this->y() + this->height() * 2);

ожидает значения в экранных координатах, а Вы передаете локальные.
Надо делать так:

lookupView_->move(mapToGlobal(this->x(), this->y() + this->height() * 2));
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
KlimichKartorgnusov
Гость
« Ответ #3 : Май 23, 2016, 14:55 »

Чем не устроил QToolButton с menu() ?

Мне нужно отображать QWidget.  Я делал так:
Код:

QWidget *someWidget = new QWidget(this);
QToolButton *someButton = new QToolButton (this);

QWidgetAction *widgetAction = new QWidgetAction(this);
widgetAction->setDefaultWidget(someWidget );

QMenu *menu = new QMenu(this);
menu->addAction(popupWidget);

someButton ->setMenu(menu);

Но у меня не получилось  В замешательстве
Может я что то не то делаю?
Записан
KlimichKartorgnusov
Гость
« Ответ #4 : Май 23, 2016, 14:56 »

Потому что

lookupView_->move(this->x(), this->y() + this->height() * 2);

ожидает значения в экранных координатах, а Вы передаете локальные.
Надо делать так:

lookupView_->move(mapToGlobal(this->x(), this->y() + this->height() * 2));

Работает, спасибо!
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #5 : Май 23, 2016, 16:19 »

Код:
menu->addAction(popupWidget);
popupWidget  Непонимающий
Записан

Qt 5.11/4.8.7 (X11/Win)
KlimichKartorgnusov
Гость
« Ответ #6 : Май 23, 2016, 17:01 »

Код:
menu->addAction(popupWidget);
popupWidget  Непонимающий

Получилось сделать с QMenu без костылей.

Код:
class LookupBox : public QPushButton
{
    Q_OBJECT
public:
    explicit LookupBox(QWidget *parent = 0) : QPushButton(parent)
    {
        QMenu *menu = new QMenu(this);

        QLineEdit *searchEdit = new QLineEdit(this);
        searchEdit->setPlaceholderText("Поиск");

        QFrame* separator = new QFrame(this);
        separator->setFrameShape(QFrame::HLine);
        separator->setFrameShadow(QFrame::Sunken);

        QListView *listView = new QListView(this);

        QVBoxLayout *mainLayout = new QVBoxLayout;
        mainLayout->addWidget(searchEdit);
        mainLayout->addWidget(separator);
        mainLayout->addWidget(listView);
        mainLayout->setContentsMargins(0, 0, 0, 0);
        mainLayout->setSpacing(0);

        QWidget *lookupWidget = new QWidget(this);
        lookupWidget->setLayout(mainLayout);

        QWidgetAction *lookupWidgetAction = new QWidgetAction(this);
        lookupWidgetAction->setDefaultWidget(lookupWidget);

        menu->addAction(lookupWidgetAction);

        setMenu(menu);
    }
};

Как сделать resize QMenu? Он вроде наследник QWidget, а на resize() не реагирует  В замешательстве
« Последнее редактирование: Май 23, 2016, 17:03 от KlimichKartorgnusov » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 22.