转载:https://www.cnblogs.com/csuftzzk/p/qss_combobox.html
转载:https://www.bbsmax.com/A/E35pLgRK5v/
转载:https://www.cnblogs.com/peterliang/p/3618820.html(QSplitter 拆分窗口)
转载:http://blog.sina.com.cn/s/blog_a6fb6cc90101i8it.html
Demo参考网上的例子,暂时记录下来,随后再整理
1.自定义combobox中的item控件
#include <QWidget>
#include <QLabel>
class ComboboxItem : public QWidget
{
Q_OBJECT
public:
ComboboxItem(QWidget *parent);
~ComboboxItem();
void setLabelContent(const QString & str);
signals:
void chooseAccount(const QString&);
private:
QLabel* m_img;
QLabel* m_label;
};
#include "ComboboxItem.h"
#include <QHBoxLayout>
ComboboxItem::ComboboxItem(QWidget *parent)
: QWidget(parent)
{
m_img = new QLabel(this);
m_label = new QLabel(this);
m_img->setStyleSheet("QLabel{background: rgb(255, 0, 0)}");
m_img->setFixedSize(15, 20);
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(m_img);
layout->addWidget(m_label);
layout->setContentsMargins(5, 5, 5, 5);
setLayout(layout);
}
ComboboxItem::~ComboboxItem()
{
}
void ComboboxItem::setLabelContent(const QString & str)
{
m_label->setText(str);
}
2.自定义代理
#include <QStyledItemDelegate>
class NoFocusFrameDelegate :public QStyledItemDelegate
{
Q_OBJECT
public:
NoFocusFrameDelegate(QObject* parent = 0);
~NoFocusFrameDelegate();
virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
};
#include "NoFocusFrameDelegate.h"
NoFocusFrameDelegate::NoFocusFrameDelegate(QObject* parent /*= 0*/)
{
}
NoFocusFrameDelegate::~NoFocusFrameDelegate()
{
}
void NoFocusFrameDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QStyleOptionViewItem view_option(option);
if (view_option.state & QStyle::State_HasFocus) {
view_option.state = view_option.state ^ QStyle::State_HasFocus;
}
QStyledItemDelegate::paint(painter, view_option, index);
}
3.主窗口中使用
#include <QtWidgets/QMainWindow>
#include "ui_QMyCombobox.h"
class QListWidget;
class QMyCombobox : public QMainWindow
{
Q_OBJECT
public:
QMyCombobox(QWidget *parent = Q_NULLPTR);
public slots:
void onChooseAccount(const QString& str);
private:
Ui::QMyComboboxClass ui;
QListWidget* m_listWidget;
};
#include "QMyCombobox.h"
#include <QListWidget>
#include "NoFocusFrameDelegate.h"
#include "ComboboxItem.h"
QMyCombobox::QMyCombobox(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_listWidget = new QListWidget(this);
// 设置子项目代理,否则下拉框选项周围会出现虚线框
m_listWidget->setItemDelegate(new NoFocusFrameDelegate(this));
ui.comboBox->setEditable(true);
ui.comboBox->setModel(m_listWidget->model());
ui.comboBox->setView(m_listWidget);
// 在下拉框中添加5个选项
for (int i = 0; i < 5; ++i)
{
ComboboxItem* item = new ComboboxItem(this);
item->setLabelContent(QString("Account") + QString::number(i, 10));
connect(item, SIGNAL(chooseAccount(const QString&)), this, SLOT(onChooseAccount(const QString&)));
QListWidgetItem* widgetItem = new QListWidgetItem(m_listWidget);
m_listWidget->setItemWidget(widgetItem, item);
}
}
void QMyCombobox::onChooseAccount(const QString& str)
{
ui.comboBox->setCurrentText(str);
}
最后效果: