2016-12-15 48 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/wwwidgets/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。例如:

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

它應該參考上面創建的'顏色'地圖。更新了樣本 – 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