Название: Расположение Popup под кнопкой.
Отправлено: 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(); }
Название: Re: Расположение Popup под кнопкой.
Отправлено: GreatSnake от Май 23, 2016, 14:02
Чем не устроил QToolButton с menu() ?
Название: Re: Расположение Popup под кнопкой.
Отправлено: Racheengel от Май 23, 2016, 14:37
Потому что
lookupView_->move(this->x(), this->y() + this->height() * 2);
ожидает значения в экранных координатах, а Вы передаете локальные. Надо делать так:
lookupView_->move(mapToGlobal(this->x(), this->y() + this->height() * 2));
Название: Re: Расположение Popup под кнопкой.
Отправлено: KlimichKartorgnusov от Май 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);
Но у меня не получилось :-\ Может я что то не то делаю?
Название: Re: Расположение Popup под кнопкой.
Отправлено: KlimichKartorgnusov от Май 23, 2016, 14:56
Потому что
lookupView_->move(this->x(), this->y() + this->height() * 2);
ожидает значения в экранных координатах, а Вы передаете локальные. Надо делать так:
lookupView_->move(mapToGlobal(this->x(), this->y() + this->height() * 2));
Работает, спасибо!
Название: Re: Расположение Popup под кнопкой.
Отправлено: GreatSnake от Май 23, 2016, 16:19
menu->addAction(popupWidget);
popupWidget ???
Название: Re: Расположение Popup под кнопкой.
Отправлено: KlimichKartorgnusov от Май 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() не реагирует :-\
|