2017-12-22 18 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番目の項目の2またはGが表示されます。

これを実行する私の目標は、アイテムの文字列の一部がかなり長く、QComboBoxが非常に短いラベルが必要なため、実際には選択範囲全体を表示するために必要な表示スペースドロップダウン状態ではアクティブ化されません。さらに、項目文字列は説明的であり、略語は表示のためによりよく機能する。

編集:
Marekの例を使用すると、これが役立つと思われます。ここに私が持っているものがあります。ユーザーがリストから選択すると、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の使い方が分かりません。その後、

qc->setWidth(20); 

しかし、あなたは本当に、ユーザーが何かを選択したい場合は、::ちょうど作るそれを短くするために、あなたの例では

答えて

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をご覧ください。


別の解決策は、複数の長さの使用翻訳です。あなたは1つの文字列のためのカップルの翻訳を提供することができます。各翻訳は、以前のものよりもグラフィカルに短くする必要があります。

QStringには、すべての可能性が空間文字で区切られています。このような文字列がレンダリングされると、利用可能なスペースに収まる部分文字列(セパレータ間)が使用されます。

私はセパレータ値が何であるか覚えていません。私はこの非常に長い時間前(Qt 4.8で)これを使用しましたが、今は参照を見つけることができません。

+0

ヒント: 'QComboBox' alreayにはデフォルトの' QStandardItemModel'があります。 –

+0

タイプミスを除いて、私はそれを入れましたが、選択された値として表示されているUserRole値に問題がありました(つまり、 。 DisplayRole ["Green"]が選択された値で、ドロップダウンリストがDisplayRole ["Green"]値であることを除いて、すべて動作します。通常の非ドロップダウン状態では、選択された値としてUserRole値が表示されません。 – Ender

+0

これにはまだ問題があります。誰もが考えていることを感謝します。ユーザーロールを通常(非ドロップダウン)状態で表示させることはできません。 – Ender

-1

((QC、SIGNAL(onCurrentIndexChanged(int)を)接続し、SLOT changeComboText())); [...]

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

あまりにも醜い。この解決策は、多くの非致死的な信号を強制的に発する。特別なテキスト変更信号。編集可能なコンボボックスでは機能しません。 –

+0

あとでqc-> blockSignals(true)を使用してください。その場合。 – stanislav888

+0

ほとんどの素晴らしい解決策は、テキストのないカラーのアイテムを作成します。しかしそれははるかに複雑になります。 – stanislav888

関連する問題