2016-12-15 51 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