微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

设置多列的 QComboBox 文本

如何解决设置多列的 QComboBox 文本

我有一个包含 QTableView 的 QComboBox,如下所示。当我选择一行时,QComboBox 标题显示“Alex”,但我想要“Alex - Alex 地址”。我该怎么做? 谢谢。

enter image description here

解决方法

I suggested

您是否尝试过将信号 QComboBox::currentIndexChanged(int index) 与 QComboBox::setEditText() 结合使用?如果 editable 为 false,我不太确定这是否也有效,但可能值得一试。

OP 要求回答,因为这似乎很有价值。

那么,我们开始吧:

// standard C++ header:
#include <string>
#include <vector>

// Qt header:
#include <QtWidgets>

// table data entry
struct Entry {
  int i;
  std::string name;
  std::string address;
};

// custom table model
class TableModel: public QAbstractTableModel {
  private:
    std::vector<Entry> _entries;

  public:
    explicit TableModel(QObject *pQParent = nullptr):
      QAbstractTableModel(pQParent)
    { }

    template <typename ITER>
    TableModel(ITER first,ITER last,QObject *pQParent = nullptr) :
      TableModel(pQParent)
    {
      for (; first != last; ++first) _entries.push_back(*first);
    }

    virtual ~TableModel() = default;

    TableModel(const TableModel&) = delete;
    TableModel& operator=(const TableModel&) = delete;

    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
    {
      return (int)_entries.size();
    }

    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
    {
      return 3;
    }

    virtual QVariant data(const QModelIndex &index,int role = Qt::DisplayRole) const override
    {
      const size_t i = (size_t)index.row();
      if (i >= _entries.size()) return QVariant();
      if (role == Qt::DisplayRole) {
        switch (index.column()) {
          case 0: return _entries[i].i;
          case 1: return QString::fromStdString(_entries[i].name);
          case 2: return QString::fromStdString(_entries[i].address);
        }
      }
      return QVariant();
    }
};

// sample data
const Entry entries[] = {
  { 1,"Alex","Alex address" },{ 5,"Ben","Ben address" },{ 6,"Mary","Mary address" },{ 2,"Max","Max address" },{ 4,"Nicole","Nicole address" },{ 3,"Tim","Tim address" }
};

// main application
int main(int argc,char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc,argv);
  // setup GUI
  TableModel qTblModel(std::begin(entries),std::end(entries));
  QComboBox qCBox;
  qCBox.setWindowTitle("Test QComboBox with Table Model");
  QTableView qTblView(&qCBox);
  qTblView.setModel(&qTblModel);
  qTblView.horizontalHeader()->hide();
  qTblView.verticalHeader()->hide();
  qTblView.resizeColumnsToContents();
  qTblView.setSelectionBehavior(QTableView::SelectRows);
  qCBox.setView(&qTblView);
  qCBox.setModel(&qTblModel);
  qCBox.setEditable(true); // allow access to line edit
  qCBox.lineEdit()->setReadOnly(true); // prevent editing in line edit
  qCBox.show();
  // install signal handlers
  QObject::connect(&qCBox,QOverload<int>::of(&QComboBox::currentIndexChanged),[&](int i) {
      if ((size_t)i < std::size(entries)) {
        qCBox.setEditText(
          QString::fromStdString(entries[i].name + " | " + entries[i].address));
      }
    });
  qCBox.setCurrentIndex(-1);
  // runtime loop
  return app.exec();
}

输出:

snapshot of testQComboBoxTableModel.exe (animated)

实际上需要将 QComboBox::editable 设置为 true 才能使 QComboBox::setEditText() 工作。

为了防止意外的用户编辑,我依次将嵌入的 QLineEdit 设置为 readOnly

,

假设你有一张桌子,你可以将 att "Selection behavior" 设置为 select Rows

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。