2016-12-15 26 views
0

ドロップダウンリストから色を選択したいのですが、その色に基づいてウィンドウに矩形を描きたいと思います。 私はあらかじめ定義された色で矩形を描画できますが、どのようにコンボボックスから色を渡すことができないのか分かりません。 ウィンドウに描画される矩形は1つのみです。ウィンドウに複数の矩形を描画します。QT-コンボボックスから色を選択して矩形を描く

したがって、手順は次のようになります。ユーザーはプッシュボタンをクリックします - >コンボボックスが表示されます--->色を選択 - > OKをクリックすると、その色の四角形がウィンドウに表示されます。

Dialog.cpp

Dialog::Dialog(QWidget *parent) : 
    QDialog(parent), 
    ui(new Ui::Dialog) 
{ 
    ui->setupUi(this); 
} 

Dialog::~Dialog() 
{ 
    delete ui; 
} 

class CustomDialog : public QDialog 
{ 
public: 
    CustomDialog(const QStringList& items) 
    { 
     setLayout(new QHBoxLayout()); 

     box = new QComboBox; 
     box->addItems(items); 
     layout()->addWidget(box); 
     connect(box, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(colorSelected(const QString&))); 
     QPushButton* ok = new QPushButton("ok"); 
     layout()->addWidget(ok); 
     connect(ok, &QPushButton::clicked, this, [this]() 
     { 
      accept(); 
     }); 
    } 

    QComboBox* combobox() { return box; } 

private: 
    QComboBox* box; 
}; 

void Dialog::on_pushButton_clicked() 
{ 
    QStringList itemList({"Red", "Blue", "Green"}); 
    CustomDialog dialog(itemList); 
    // connect(box, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(colorSelected(const QString&))); 
    if (dialog.exec() == QDialog::Accepted) 
    { 

     scene = new QGraphicsScene(this); 
     ui->graphicsView->setScene(scene); 
     QBrush redBrush(Qt::red); 
     QBrush blackBrush(Qt::black); 
     QPen blackpen(Qt::black); 
     blackpen.setWidth(3); 
     rectangle = scene->addRect(10,10,100,100,blackpen,redBrush); 
     rectangle->setFlag(QGraphicsItem::ItemIsMovable); 
    } 
} 

void Dialog::colorSelected(const QString& text) 
{ 
     const QColor selected = colorMap[text]; 
} 

前のポストdoesntのは、私の質問を解決します。

+0

OT:wwWidgetsは素敵なカラーチューコンボボックスがあります。 http://www.wysota.eu.org/wwwidgets/ doc:http://www.wysota.eu.org/wwwidwiki/doc/html/qwwcolorcombobox.html – drescherjm

+0

私は私が使用したい私の定義済みの色を持っています。私はちょうどQTのドロップダウンから選択された色に基づいて矩形を作成したい – PSDebugger

+0

そして何が問題なのですか?ダイアログから選択した色を取得して使用します。 – ilotXXI

答えて

0

カラーピッカーに興味がなく、QComboBoxで独自のソリューションを使用する場合は、使用する独自の色を事前に定義することができます。

マップを宣言することができます。たとえば、QMap<QString, QColor> colors;という文字列を表すキーの下に色の値を保持するマップを宣言できます。

次に、希望の値を定義する必要があります。たとえば:

colors = 
{ 
    {"Red", QColor(255, 0, 0)}, 
    {"Green", QColor(0, 255, 0)}, 
    {"Blue", QColor(0, 0, 255)}, 
}; 

あなたが簡単にQComboBoxの内容を埋めるために、このマップを使用することができます。それは書き込みとして速いです:

box->addItems(colors.keys()); 

次のアクションは、色の値を知る必要があるときに依存します。ユーザーがそれを選択した直後に知りたい場合は、適切なconnectを作成する必要があります。 colorSelectedは、あなたが選択した色値を処理スロットだろうどこ

connect(box, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(colorSelected(const QString&))); 

:たとえば、上記に加えて

void Dialog::colorSelected(const QString& text) 
{ 
    const QColor selected = colors[text]; 
    // do what you need with the color 
} 
+0

colorMapを追加するときにエラーが発生します。私はどこが間違っているのか見ていただけますか? – PSDebugger

+0

このスコープではcolorMapが宣言されていないため、エラーが発生します。 – PSDebugger

+0

上記で作成した 'colors'マップを参照する必要があります。サンプルを更新しました。 – Dusteh

0

、私は色の定義を保持するためのアイテムデータを使用してお勧めしたいです。次を参照してください。

QComboBox::setItemData 
QComboBox::itemData 
QComboBox::currentData 

コンボボックスの各項目には2つのコンポーネントがあります。表示されているテキストがあり、関連するQVariantがあります。これはアイテムデータです。 QVariantは、別々に保存する必要がないように、色の定義を保持することができます。実際には、2つ以上のユーザーロールを定義できるため、コンボボックスアイテムごとにさらに多くのデータ要素を格納できます。ただし、目的のために、デフォルトのUserRoleで十分です。

あなたcolorSelected定義は次のようになります。

void Dialog::colorSelected (const QString &text) 
{ 
    const QColor selected = box->currentData().value <QColor>(); 
    // do what you need with the color 
} 
+0

これも問題ありません。しかし、マップを別々に保存する必要はないということは議論の余地があります。私の視点から見ると、あなたはまだ小さいスコープにする必要があります。あなたはまだデータを埋める必要があり、 'setItemData'は一度に1つの項目しか取りません。 – Dusteh

+0

マップが必要かどうかは、わからないものによって決まります。私は人口面については言及しなかった。 "addItem"オーバーロードの1つは、テキストとユーザーデータを同時に追加できるため、実際には1回の呼び出しで実行できます。それを言わせていただきありがとうございます。複数のユーザーデータがある場合は、別々の呼び出しを使用する必要がありますが、このケースは私の経験では非常に一般的です。したがって、単一のユーザーデータ項目とペアになったテキストで十分です。 – goug

+0

上記の問題は正しいですか?ここでは何もわかりません。addItemには適切なオーバーロードがあり、 'userData'でペアになっているテキストで十分です。それにもかかわらず、既にデータをコンテナの一種に渡している別のメソッドからデータが来ない場合(つまり、ループして、必要なものを設定するために 'addItem'を呼び出すことができます)、追加のコンテナでは、 'addItem'を複数回呼び出す必要があります。それでも、これは実際には私たちには分かっていない要件を著者が決定すべきものです。 – Dusteh