& quot; QComboBox Pop-up & quot; расширяется и QtWebkit

В Firefox / Chrome / InternetExplorer / Safari / Opera всплывающие окна из поле со списком разверните как содержание, см. изображение Firefox:

Firefox combobox

QComboBox всплывающее окно не расширяет содержимое. Всплывающие окна ограничены размером QComboBox, увидеть QWebView картина:

Qt и QtWebkit комбинированный список

Поэтому я реализовал QComboBox :: showPopup:

void newQComboBox::showPopup() {
int width = this->width();
this->view()->setTextElideMode( Qt::ElideNone );

const int iconSize = this->iconSize().width();
const QFontMetrics fontMetrics = this->fontMetrics();
const int j = this->count();

for( int i=0; i < j; ++i ) {
const int textWidth = fontMetrics.width( this->itemText(i) + "WWW" );
if (this->itemIcon(i).isNull()) {
width = qMax(width, textWidth);
} else {
width = qMax(width, textWidth + iconSize);
}
}

QStyleOptionComboBox opt;
this->initStyleOption(&opt);
QSize size(width, 0);
size = this->style()->sizeFromContents(QStyle::CT_ComboBox, &opt, size, this);

this->view()->setFixedWidth( width );

QComboBox::showPopup();
}

Есть ли способ изменить (переопределить) QComboBox::showPopup из QWebViews (QtWebKit)?

Qt-BUG (предложение): https://bugreports.qt.io/browse/QTBUG-35771

9

Решение

Я решил использовать QProxyStyle класс, пример:

#include <QProxyStyle>
#include <QAbstractItemView>
#include <QComboBox>

class myProxyStyle : public QProxyStyle
{

public:
int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const
{
if(hint == QStyle::SH_ComboBox_Popup) {
const QComboBox *combo = (QComboBox *) widget;//cast to QComboBox
const QObjectList a = combo->children();
const int j = a.count();
QAbstractItemView *view = 0;
QString className = "";
bool hasView = false;

/*
at this point I have not used combo->view() because he "crash" the application without explanation
so I had to make a loop to find the "view"*/
for (int i = 0; i < j; ++i) {
const QObjectList b = a.at(i)->children();
const int y = b.count();

for (int x = 0; x < y; ++x) {
className = b.at(x)->metaObject()->className();

if (className == "QComboBoxListView") {
view = (QAbstractItemView *) b.at(x);
hasView = true;
break;
}
}

if (hasView) {
break;
}
}

if (hasView) {
const int iconSize = combo->iconSize().width();
const QFontMetrics fontMetrics1 = view->fontMetrics();
const QFontMetrics fontMetrics2 = combo->fontMetrics();
const int j = combo->count();
int width = combo->width(); //default width

for (int i = 0; i < j; ++i) {
const int textWidth = qMax(
fontMetrics1.width(combo->itemText(i) + "WW"),
fontMetrics2.width(combo->itemText(i) + "WW")
);

if(combo->itemIcon(i).isNull()) {
width = qMax(width, textWidth);
} else {
width = qMax(width, textWidth + iconSize);
}
}

view->setFixedWidth(width);
}
}

return QProxyStyle::styleHint(hint, option, widget, returnData);
}
};

как пользоваться:

Вы должны подать заявление в QApplication (обычно файл main.cpp):

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
a.setStyle(new myProxyStyle);//set ProxyStyle

return a.exec();
}

@peppe благодаря вашему комментарию я получил решение

6

Другие решения

Пожалуйста, попробуйте использовать функцию setMinimumWidth и передайте максимальную ширину, которую вы рассчитали. он должен работать
ui.comboBox-> Вид () -> setMinimumWidth (ширина);
для более подробной информации, пожалуйста, пройдите https://qt-project.org/forums/viewthread/26388 ссылка на сайт

-2

По вопросам рекламы [email protected]