2016-12-15 1 views
0

드롭 다운에서 색상을 선택하고 해당 색상을 기준으로 창에 직사각형을 그립니다. 미리 정의 된 색상으로 사각형을 그릴 수는 있지만 콤보 박스에서 색상을 전달하는 방법을 모릅니다. 창이 하나의 직사각형으로 그려지기 때문에 창에 여러 개의 직사각형을 그려야합니다.QT- 콤보 박스에서 색상을 선택하고 직사각형을 그립니다.

따라서 절차는 다음과 같습니다. 사용자가 누름 버튼을 클릭합니다 -> 콤보 박스가 나타납니다 ---> 색상을 선택하십시오 -> 확인을 클릭하면 해당 색상의 사각형이 창에 나타납니다.

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]; 
} 

이전 포스트 나던 내 질문을 해결한다.

+0

OT : wwWidgets 좋은 색상 선택기 콤보 상자가 있습니다. http://www.wysota.eu.org/wwwidgets/doc : http://www.wysota.eu.org/wwwidwiki/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을 올바르게 작성해야합니다. 예를 들면 :

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

colorSelected 당신이 선택한 색상 값을 처리하는 슬롯을 것 장소 :

위 외에도
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 

콤보 상자의 각 항목은 두 가지 구성 요소가 있습니다; 표시되는 텍스트가 있으며 관련 QVariant가 있습니다. 이는 항목 데이터입니다. QVariant는 별도로 저장할 필요가 없도록 색상 정의를 저장할 수 있습니다. 실제로는 두 개 이상입니다. 원하는만큼 많은 사용자 역할을 정의 할 수 있기 때문에 콤보 상자 항목 당 더 많은 데이터 요소를 저장할 수 있습니다. 그러나 사용자 목적에 맞게 기본 UserRole만으로 충분합니다.

귀하의 colorSelected 정의는 다음과 같습니다

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

업데이트 됨. 괜찮을 것입니다. 그러나지도를 별도로 저장할 필요가 없다는 것이 논쟁의 여지가 있습니다. 내 관점에서 당신은 여전히 ​​작은 범위에 있어야합니다. 여전히 데이터를 채울 필요가 있으며'setItemData'는 한 번에 하나의 항목 만 취합니다. – Dusteh

+0

지도가 필요한지 여부는 우리가 모르는 물건에 따라 다릅니다. 나는 인구 측면을 언급하는 것을 게을리했다. "addItem"오버로드 중 하나는 텍스트와 사용자 데이터를 동시에 추가 할 수 있으므로 하나의 호출에서 실제로 수행 할 수 있습니다. 언급 해 주셔서 감사합니다. 하나 이상의 사용자 데이터가있는 경우 별도의 호출을 사용해야하지만이 경우는 내 경험에서 매우 일반적이므로 단일 사용자 데이터 항목과 쌍을 이루는 텍스트가 대개 매우 충분합니다. – goug

+0

위에서 언급 한 사항에 당신이 맞습니다 : 우리는 물건을 여기에 모릅니다. addItem은 적절한 과부하를 가지고 있으며, 쌍을 이루는 텍스트는'userData'로 충분합니다. 그럼에도 불구하고 데이터가 이미 일종의 컨테이너에 들어있는 다른 메서드에서 가져온 데이터가 아니라면 (그래서 루프를 돌리고 필요한 항목을 설정하기 위해'addItem'을 호출 할 수 있습니다.) 그리고 어떤 것을 피하는 색상 세트를 정의하고 싶습니다 추가 컨테이너가 있으면'addItem'을 여러 번 호출해야합니다. 여전히 실제로 이것은 저자가 우리에게 알려지지 않은 요구 사항을 결정해야합니다. – Dusteh

관련 문제