【问题标题】:"QComboBox Pop-up" expanding and QtWebkit“QComboBox Pop-up”扩展和QtWebkit
【发布时间】:2013-12-31 12:56:42
【问题描述】:

在 Firefox/Chrome/InternetExplorer/Safari/Opera 中弹出的组合框作为内容展开,参见 Firefox 图片:

QComboBox 弹出窗口不展开内容。 弹窗受限于QComboBox的大小,见QWebView图片:

所以我实现了 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::showPopupQWebViews (QtWebkit)?

Qt-BUG(建议): https://bugreports.qt.io/browse/QTBUG-35771

【问题讨论】:

  • 你用的是什么风格?弹出窗口的显示方式,以及匹配的视图是否具有与组合框相同的大小或允许更大,完全取决于所使用的样式。
  • ... 它还告诉您如何修复它:请参阅QComboBox::showPopup 代码并使用 QProxyStyle 转移正确的调用。当然,所有这些都是假设 QWebView 使用的是 QComboBox,而不是类似于 QComboBox...
  • 您是否可以访问您希望显示此ComboBox 的HTML 文件,或者您无法控制QWebView 显示的内容?因为我实现了一个组合框,它使用您的自定义 QComboBoxQWebView 但它仅在 HTML 页面使用特定代码时才有效,而不是 &lt;select&gt; 代码来显示 ComboBox
  • @user2014561 我正在开发浏览器而不是特定的应用程序。我需要访问任何网站,如 Firefox/InternetExplorer/Chrome 浏览器(我的意思是组合框,就像我发布的屏幕截图:i.stack.imgur.com/VOn9w.png)。谢谢
  • @peppe 感谢您的评论,我可以找到解决方案。

标签: c++ qt qtwebkit qcombobox qtgui


【解决方案1】:

我用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感谢您的评论我得到了解决方案

【讨论】:

    【解决方案2】:

    请尝试使用 setMinimumWidth 函数并传递您计算的最大宽度。它应该工作 ui.comboBox->view()->setMinimumWidth(width); 更多详情请通过https://qt-project.org/forums/viewthread/26388链接

    【讨论】:

    • 组合框由 Web 视图显示。作者已经有一个可行的实现,问题是如何让 web 视图使用他的实现。
    • 我在这里同意@Kuba。
    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多