【问题标题】:How to create a button in editing field of ComboBox?如何在 ComboBox 的编辑字段中创建按钮?
【发布时间】:2019-02-26 12:21:31
【问题描述】:

要求是当我们在 ComboBox 中输入内容时,该字段右侧会出现一个 X 按钮(以删除我们输入的内容)。我该怎么做?

setClearButtonEnabled 的结果

【问题讨论】:

    标签: c++ qt qt5 qcombobox


    【解决方案1】:

    您必须启用QLineEditclearButtonEnabled 属性:

    #include <QtWidgets>
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QComboBox combo;
        combo.setEditable(true);
        if(QLineEdit *le = combo.lineEdit())
            le->setClearButtonEnabled(true);
        combo.show();
        return a.exec();
    }
    

    更新:

    你必须创建一个自定义的 QLineEdit。

    #include <QtWidgets>
    
    class LineEdit: public QLineEdit
    {
        Q_OBJECT
    public:
        LineEdit(QWidget *parent=nullptr):
            QLineEdit(parent)
        {
            QAction *action = addAction(QIcon(":/clear.png"), QLineEdit::TrailingPosition);
            button = qobject_cast<QToolButton *>(action->associatedWidgets().last());
            button->hide();
            connect(this, &QLineEdit::textChanged, this, &LineEdit::onTextChanged);
            connect(button, &QToolButton::clicked, this, &QLineEdit::clear);
        }
    private slots:
        void onTextChanged(const QString & text){
            button->setVisible(!text.isEmpty());
        }
    private:
        QToolButton *button;
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QComboBox combo;
        combo.setEditable(true);
        combo.setLineEdit(new LineEdit);
        combo.show();
        return a.exec();
    }
    #include "main.moc"
    

    另一种选择:自定义样式

    #include <QtWidgets>
    
    class ClearLineEditStyle: public QProxyStyle{
    public:
        using QProxyStyle::QProxyStyle;
        QPixmap standardPixmap(StandardPixmap standardIcon, const QStyleOption *option, const QWidget *widget) const{
            if(standardIcon == SP_LineEditClearButton){
                return QPixmap(":/clear.png");
            }
            return QProxyStyle::standardPixmap(standardIcon, option, widget);
        }
    };
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QComboBox combo;
        ClearLineEditStyle *style = new ClearLineEditStyle(combo.style());
        combo.setStyle(style);
        combo.setEditable(true);
        if(QLineEdit *le = combo.lineEdit())
                le->setClearButtonEnabled(true);
        combo.show();
        return a.exec();
    }
    

    【讨论】:

    • 非常感谢您的帮助。抱歉,我忘了说,X 按钮有一个.png 文件(比如说x.png)。此按钮应具有透明背景(如上图所示)。所以我需要把这张图片作为按钮的背景。您的解决方案显示了标准的 X 按钮,这不是我想要的。 (我在上面更新了)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多