Углы последнего выделенного элемента QComboBox пересекаются с границей всплывающего окна [дубликат]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Углы последнего выделенного элемента QComboBox пересекаются с границей всплывающего окна [дубликат]

Сообщение Anonymous »

Я переопределил класс QComboBox и добавил закругленные углы во всплывающую панель:
[img]https://i.stack.imgur.com /DhWqC.png[/img]

Но когда выделен последний элемент, его углы пересекают границу всплывающего окна.
Изображение

Я хочу, чтобы нижние углы выделения были закруглены, когда выделен последний элемент .
Я пытался перехватить сигнал QComboBox::highlighted следующим образом:
connect(this,
SIGNAL(highlighted(int)),
this,
SLOT(selectionChangedSlot(int)),
Qt::DirectConnection);

Но это не сработало. Я могу уловить другие сигналы, такие как currentIndexChanged, но не выделенные.
Что не так? Или, может быть, есть другой способ стилизовать выбор QComboBox таким образом?
Я добавил снимок экрана в другом окне, чтобы показать реальные границы всплывающего окна:
Изображение

Заголовок:
#ifndef CUSTOMDROPDOWN_H
#define CUSTOMDROPDOWN_H
#include
#include "commomColors.h"
#include
#include
#include
#include
#include
class customdropdown : public QComboBox
{
Q_OBJECT
public:
explicit customdropdown(QWidget *parent = nullptr);

public slots:
protected:
virtual void showPopup() override;
virtual void hidePopup() override;
};
class Delegate : public QStyledItemDelegate
{
virtual void paint( QPainter *, const QStyleOptionViewItem &option, const QModelIndex &index) const override;
};
#endif // CUSTOMDROPDOWN_H

исходный код:
#include "customdropdown.h"

customdropdown::customdropdown(QWidget *parent) : QComboBox(parent)
{
this->view()->window()->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint );
this->view()->window()->setAttribute(Qt::WA_TranslucentBackground);
this->setItemDelegate(new Delegate());
setStyleSheet("QComboBox {" //ComboBox
"border: 1px solid " RED";"
"border-radius: 8px;"
"font-size: 14px;"
"combobox-popup: 0;"
"background: transparent;"
"padding: 0px 0px 0px 10px;""}"
"QComboBox QAbstractItemView {"
"color: #000000; "
"background-color: magenta;"
"border: 1px solid " GREEN";"
"border-radius: 8px;""}"
"QListView::item {"
"height: 26px;""}"
"QComboBox::down-arrow {"
"image: url(\":/rsc/img/down_arrow.png\");""}"
"QComboBox::drop-down:button {"
"border: 1px solid #FFFFFF"";"
"border-radius: 8px;"
"border-left: none;"
"background-color: transparent;"
"width: 30px;""}"
"QComboBox:disabled{"
"background-color: " DISABLED_BACK_COLOR";"
"color: " DISABLED_TEXT_COLOR";""}");
}
void customdropdown::showPopup()
{
setStyleSheet("QComboBox {" //ComboBox
"border: 1px solid " RED";"
"border-bottom-left-radius: 0px;"
"border-bottom-right-radius: 0px;"
"border-top-left-radius: 8px;"
"border-top-right-radius: 8px;"
"font-size: 14px;"
"combobox-popup: 0;"
"background: transparent;"
"padding: 0px 0px 0px 10px;""}"
"QComboBox QAbstractItemView {"
"font-size: 14px;"
"border: 1px solid " GREEN";"
"border-bottom-left-radius: 8px;"
"border-bottom-right-radius: 8px;"
"border-top-left-radius: 0px;"
"border-top-right-radius: 0px;""}"
"QComboBox::down-arrow {"
"image: url(\":/rsc/img/down_arrow.png\");""}"
"QComboBox::drop-down:button {"
"border: 1px solid #FFFFFF"";"
"border-radius: 8px;"
"border-left: none;"
"background-color: transparent;"
"width: 30px;""}");
QListView *view = new QListView(this);
view->setStyleSheet("QListView::item{"
"border: none;"
"padding-left: 7px;"
"height: 30px;""}"
"QListView::item:selected{"
"color: #000000;"
"background-color: " BLUE";""}");
this->setView(view);
QComboBox::showPopup();
}
void customdropdown::hidePopup()
{
setStyleSheet("QComboBox {" //ComboBox
"border: 1px solid " RED";"
"border-radius: 8px;"
"font-size: 14px;"
"combobox-popup: 0;"
"background: transparent;"
"padding: 0px 0px 0px 10px;""}"
"QComboBox::down-arrow {"
"image: url(\":/rsc/img/down_arrow.png\");""}"
"QComboBox::drop-down:button {"
"border: 1px solid #FFFFFF"";"
"border-radius: 8px;"
"border-left: none;"
"background-color: transparent;"
"width: 30px;""}");
QComboBox::hidePopup();
}
void Delegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QPainterPath path;
path.addRect(option.rect.x(), option.rect.y(), option.rect.width(), option.rect.height());
if (index.row() == (index.model()->rowCount()-1)) //if the last item
{
path.clear();
path.addRoundedRect( option.rect, BORDER_RADIUS, BORDER_RADIUS );
path.addRect( QRect( (option.rect.x()+option.rect.width()-10), option.rect.y(), 10, 10 ) ); // Top right corner not rounded
path.addRect( QRect( option.rect.x(), option.rect.y(), 10, 10 ) ); // TOp left corner not rounded
}
painter->save();
painter->setClipping(true);
painter->setClipPath(path);
QStyledItemDelegate::paint(painter, option, index);
painter->restore();
}


Подробнее здесь: https://stackoverflow.com/questions/782 ... ups-border
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»