Выравнивание QPushButton поверх другого виджета

У меня есть QListWidget и QPushButton, которые очищают QListWidget. Сейчас моя кнопка находится рядом с QListWidget, оставляя неудобное пустое место.

введите здесь описание изображения

Я хотел бы разместить кнопку над QListWidget, чтобы она закрывала правый нижний угол.

Я попробовал просто разместить кнопку вот так

 QPushButton* button = new QPushButton(ui->listwidget);
 button->show();

И он создает "плавающую" кнопку над моим виджетом, но я не могу найти способ правильно ее разместить. Возможно, я смогу путем проб и ошибок найти правильные координаты, но проблема в том, что размер моего главного окна можно изменять, поэтому я не хочу, чтобы кнопка оказалась в середине списка или полностью за пределами поля зрения.

Есть ли у кого-нибудь идея получше?


person madasionka    schedule 20.12.2017    source источник
comment
Вы не используете макеты?   -  person Tom    schedule 20.12.2017
comment
@TCouch хорошо, что я был, и это оставило эту неудобную строку пустого места. Я поместил кнопку под списком, и вся полоса, равная высоте кнопки, оказалась пустой, в то время как кнопка занимала совсем немного места.   -  person madasionka    schedule 20.12.2017
comment
Нам может быть полезно посмотреть скриншот   -  person Tom    schedule 20.12.2017
comment
Конечно @TCouch! Мне пришлось скрыть данные, чтобы это выглядело немного странно, но я надеюсь, что сообщение будет досконально.   -  person madasionka    schedule 20.12.2017


Ответы (1)


Это должно быть возможно, хотя я не уверен, что вам понравится, сколько проблем или конечный результат. Но в двух словах ...

Создайте QPushButton с вашим окном в качестве родителя (я предполагаю, что QListWidget находится внутри окна или какого-либо другого контейнера QWidget, который имеет макет, который вы упомянули). Каким бы ни был родительский виджет, он будет вашей системой отсчета для координат положения вашей кнопки.

Затем вам нужно будет разместить кнопку с помощью QWidget::pos. Уловка в том, где и когда.

Поскольку позиция указана относительно родительского элемента, вам нужно будет получить внутреннюю ширину и высоту родительского элемента с помощью _ 5_, вычтите ширину и высоту вашей кнопки ( QWidget::frameSize()) и соответствующим образом установите новую позицию.

Вам нужно будет сделать это для каждого события изменения размера родительского виджета. Итак, один из способов - повторно реализовать QWidget::resizeEvent() в родительском окне. , и разместите кнопку оттуда.

Это не проверено ...

QPushButton* button = new QPushButton(this);  // parent is current QWidget
button->show();
...
void MyWidget::resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE
{
  QSize btnSize = button->frameSize();
  QSize containerSize = this->size();
  int newX = containerSize.width() - btnSize.width() - 10;  // 10 is arbitrary margin
  int newY = containerSize.height() - btnSize.height() - 10;
  // position the button
  button->move(newX, newY);
  // call the superclass handler: substitute the actual superclass here
  QWidget::resizeEvent(event);  
}

Скорее всего, вам потребуется дополнительная настройка, возможно, совсем немного, но это должно быть общей идеей. Ключ состоит в том, чтобы перемещать кнопку при каждом изменении размера родительского элемента, в том числе при первоначальном отображении.

HTH

person Maxim Paperno    schedule 20.12.2017