2017-12-22 25 views
0

Linux에서 Qt 5.9를 사용하면 여러 레이블이있는 QComboBox가 있습니다.QComboBox는 목록에있는 값과 다른 값을 표시 할 수 있습니까?

qc = new QComboBox; 
qc->addItem(tr("Red")); 
qc->addItem(tr("Green")); 
qc->addItem(tr("Blue")); 

사용자가 QComboBox를 활성화하고 3 색 레이블이 드롭 다운 목록에 표시됩니다. 사용자는 첫 번째 항목 (빨간색)을 선택합니다.

내가하고 싶은 것은 QComboBox 디스플레이에 선택된 것과 다른 값을 표시하는 것입니다. 즉, 빨간색이 선택되면 첫 번째 항목에 대해 1 (또는 빨간색에 대한 R이 될 수 있음)이 표시되고 녹색이 선택되면 두 번째 항목에 대해 2 (또는 G)가 표시됩니다.

내 목표는 일부 항목 문자열이 상당히 길고 QComboBox를 사용할 때 훨씬 짧은 레이블이 필요하기 때문에 실제로 선택 항목의 전체 텍스트를 표시하는 데 필요한 것보다 적은 표시 공간 (적은 너비)을 사용하는 것입니다. 드롭 다운 상태에서는 활성화되지 않습니다. 게다가 항목 문자열은 설명 적이며 약어는 표시하기에 더 잘 작동합니다.

편집 :
마렉의 예를 사용하면 이것이 도움이 될 것이라고 생각합니다. 여기에 내가 가진 것이있다. 사용자가 목록에서 선택하면 R, G 또는 B가 표시되어야합니다.

QStandardItem *red = new QStandardItem(); 
red->setData(tr("Red"), Qt::DisplayRole); 
red->setData("R", Qt::UserRole); 

QStandardItem *green = new QStandardItem(); 
green->setData(tr("Green"), Qt::DisplayRole); 
green->setData("G", Qt::UserRole); 

QStandardItem *blue = new QStandardItem(); 
blue->setData(tr("Blue"), Qt::DisplayRole); 
blue->setData("B", Qt::UserRole); 

QStandardItemModel *rgb_model = new QStandardItemModel(this); 
rgb_model->setItem(0, red); 
rgb_model->setItem(1, green); 
rgb_model->setItem(2, blue); 

QComboBox *rgb_cb = new QComboBox(); 
rgb_cb->setModel(rgb_model); 

Qt :: UserRole을 사용하는 방법을 이해하지 못해서 느낌이 들었습니다. 메이크업에 대한 예에서

답변

2

예 것이 가능하다. QComboBox은 데이터 모델을 사용하여 항목을 관리합니다. 각각의 데이터 값이있는 항목이있는 자체 데이터 모델을 제공해야합니다.

QStandardItem *itme1 = new QStandardItem(); 
item1->setData(tr("Red"), Qt::DisplayRole); 
item1->setData("1", Qt::UserRole); // note doesn't have to be a string. 

QStandardItem *itme2 = new QStandardItem(); 
item2->setData(tr("Green"), Qt::DisplayRole); 
item2->setData("2", Qt::UserRole); 

QStandardItemModel *model = new QStandardItemModel(this); 
mode->setItem(1, item1); 
mode->setItem(2, item2); 

qc->setModel(model); 

정상적으로 작동하지만 테스트하지 않았습니다. 적어도 이것이 어떤 단서가되어야합니다.

특히 역할에 대해서는 QComboBox documentation을 검토하십시오.


다른 해결책은 여러 길이의 번역을 사용하는 것입니다. 단일 문자열에 대해 몇 가지 번역을 제공 할 수 있습니다. 각 번역은 이전의 것보다 그래픽으로 짧아야합니다.

QString에는 공간 문자로 구분 된 모든 가능성이 포함되어 있습니다. 이러한 문자열이 렌더링 될 때 사용 가능한 공간에 맞게 부분 문자열 (구분 기호 사이)이 사용됩니다.

이제 분리 자 값이 무엇인지 기억하지 못합니다. 나는 아주 오래 전에 (Qt 4.8로) 이것을 사용해 왔지만 지금은 그것에 대한 참조를 찾을 수 없습니다.

+0

힌트 :'QComboBox' alreay는 디폴트'QStandardItemModel'을 가지고 있습니다. 따라서, 자동 모델 = qobject_cast (qc-> model());을 사용할 수 있습니다. –

+0

오타가 없습니다. 그 값을 넣었지만 UserRole 값이 선택된 값으로 표시되는 데 문제가 있습니다. . DisplayRole [ "Green"]이 선택된 값이고 드롭 다운 목록이 DisplayRole [ "Green"] 값이라는 점만 제외하면 모두 작동합니다. 정상적인 논 드롭 다운 상태에서 선택된 값으로 UserRole 값을 보지 못합니다. – Ender

+0

이 문제는 계속 발생합니다. 누구나 가질 수있는 생각을 고맙게 생각합니다. 사용자 역할을 일반 (드롭 다운 없음) 상태로 표시 할 수 없습니다. – Ender

-1

이 짧은 단지합니다

연결 (QC, SIGNAL (onCurrentIndexChanged (INT)), SLOT (:

qc->setWidth(20); 

을하지만 당신은 정말 사용자가 다음 뭔가를 선택하려면 changeComboText())); [...]

void changeComboText() 
{ 
    QString shortText; 
    //Determine short value for shortText 
    qc->setCurrentText(shortText); 
} 
+0

너무 추합니다. 이 솔루션은 많은 유해 신호를 방출합니다. 특수 텍스트 변경 신호. 편집 가능한 콤보 박스에서는 작동하지 않습니다. –

+0

뒤에 qc-> blockSignals (true)를 사용하고 앞에는 "false"를 사용하십시오.그럴 경우. – stanislav888

+0

가장 좋은 솔루션은 텍스트가없는 색상의 항목을 만듭니다. 그러나 그것은 훨씬 더 복잡 할 것입니다. – stanislav888