C++ 设置具有多列的QComboBox文本

C++ 设置具有多列的QComboBox文本,c++,qt,qtableview,qcombobox,C++,Qt,Qtableview,Qcombobox,我有一个包含QTableView的QComboBox,如下所示。当我选择一行时,QComboBox标题只显示“Alex”,但我想要“Alex-Alex地址”。我怎么做? 谢谢 假设您有一个表,您可以将att“选择行为”设置为选择行 : 您是否尝试过将信号QCOMBOX::currentIndexChanged(int index)与QCOMBOX::setEditText()结合使用?如果editable为false,我不太确定这是否也能正常工作,但可能值得检查一下 OP要求回答,因为这似乎很有

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

假设您有一个表,您可以将att“选择行为”设置为
选择行

您是否尝试过将信号QCOMBOX::currentIndexChanged(int index)与QCOMBOX::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();
}
<代码> //标准C++标题: #包括 #包括 //Qt头: #包括 //表数据输入 结构条目{ int i; std::字符串名; std::字符串地址; }; //自定义表格模型 类TableModel:公共QAbstractTableModel{ 私人: std::vector\u条目; 公众: 显式表格模型(QObject*pQParent=nullptr): QAbstractTableModel(pQParent) { } 模板 表模型(ITER第一,ITER最后,QObject*pQParent=nullptr): TableModel(pQParent) { 对于(;first!=last;++first)_条目。向后推(*first); } virtual~TableModel()=默认值; TableModel(consttablemodel&)=delete; TableModel&运算符=(const TableModel&)=删除; 虚拟整数行数(常量QModelIndex&parent=QModelIndex())常量重写 { return(int)_entries.size(); } 虚拟int columnCount(常量QModelIndex&parent=QModelIndex())常量重写 { 返回3; } 虚拟QVariant数据(常量QModelIndex&index,int-role=Qt::DisplayRole)常量覆盖 { 常量size_t i=(size_t)index.row(); 如果(i>=\u entries.size())返回QVariant(); 如果(角色==Qt::DisplayRole){ 开关(index.column()){ 案例0:返回_条目的[i].i; 案例1:返回QString::fromStdString(_entries[i].name); 案例2:返回QString::fromStdString(_entries[i].address); } } 返回QVariant(); } }; //样本数据 常量条目[]={ {1,“Alex”,“Alex地址”}, {5,“本”,“本地址”}, {6,“玛丽”,“玛丽地址”}, {2,“Max”,“Max address”}, {4,“妮可”,“妮可地址”}, {3,“Tim”,“Tim地址”} }; //主要应用 int main(int argc,字符**argv) { qDebug()隐藏(); qtlview.resizeColumnsToContents(); setSelectionBehavior(QTableView::SelectRows); qCBox.setView(&qTblView); qCBox.setModel(&qTblModel); qCBox.setEditable(true);//允许访问行编辑 qCBox.lineEdit()->setReadOnly(true);//防止在行编辑中编辑 qCBox.show(); //安装信号处理程序 QObject::connect(&qCBox,QOverload::of(&QComboBox::currentIndexChanged), [&](国际一){ 如果((尺寸)i 输出:

实际上,有必要将
QComboBox::editable
设置为
true
以使
QComboBox::setEditText()
工作


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

我已经这样做了,但它仍然只显示我的QTableView的第一列。@Ms.Sahin然后请提供可用于重现问题的代码(最好是a)。否则任何人都只能猜测。我问这个问题的目的是为了了解这是否可能,所以这个问题没有书面代码@G.M.你有没有试过把信号和信号结合起来?如果is
false
,我不太确定这是否有效,但可能值得一看。您好。成功了。请回答这个问题,我接受@舍夫