基于 4.2.3 的示例,添加 Color 菜单,添加 Black、Green、Yellow 菜单项, 默认选中 Black 菜单项,切换后以选中的颜色重新绘制图形。添加分隔符,再添 加菜单项 Fill,点击后切换是否填充图形,默认为不填充。
时间: 2024-04-17 09:26:52 浏览: 9
在基于示例的基础上,我们可以按照您的要求添加 Color 菜单和 Fill 菜单,并实现相应的功能。以下是修改后的代码示例:
```cpp
#include <QtWidgets>
class MyWidget : public QWidget
{
public:
MyWidget(QWidget *parent = nullptr) : QWidget(parent)
{
setWindowTitle("Key Press Event Example");
setFixedSize(400, 300);
createActions();
createMenus();
statusBar = new QStatusBar(this);
setStatusBar(statusBar);
currentColor = Qt::black;
fillShape = false;
}
protected:
void keyPressEvent(QKeyEvent *event) override
{
int keyValue = event->key();
// 在窗体指定位置处显示按键的键值
QToolTip::showText(mapToGlobal(QPoint(100, 100)), QString::number(keyValue), this);
// 在状态栏中显示按键的键值
statusBar->showMessage(QString("Key Value: %1").arg(keyValue));
QWidget::keyPressEvent(event);
}
void paintEvent(QPaintEvent *event) override
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
if (fillShape)
painter.setBrush(currentColor);
else
painter.setBrush(Qt::NoBrush);
painter.setPen(currentColor);
painter.drawRect(50, 50, 300, 200);
}
private:
void createActions()
{
blackAction = new QAction("Black", this);
blackAction->setCheckable(true);
blackAction->setChecked(true);
connect(blackAction, &QAction::triggered, this, &MyWidget::setBlackColor);
greenAction = new QAction("Green", this);
greenAction->setCheckable(true);
connect(greenAction, &QAction::triggered, this, &MyWidget::setGreenColor);
yellowAction = new QAction("Yellow", this);
yellowAction->setCheckable(true);
connect(yellowAction, &QAction::triggered, this, &MyWidget::setYellowColor);
fillAction = new QAction("Fill", this);
fillAction->setCheckable(true);
fillAction->setChecked(false);
connect(fillAction, &QAction::triggered, this, &MyWidget::toggleFillShape);
}
void createMenus()
{
colorMenu = new QMenu("Color", this);
colorMenu->addAction(blackAction);
colorMenu->addAction(greenAction);
colorMenu->addAction(yellowAction);
fillMenu = new QMenu("Fill", this);
fillMenu->addAction(fillAction);
menuBar = new QMenuBar(this);
menuBar->addMenu(colorMenu);
menuBar->addSeparator();
menuBar->addMenu(fillMenu);
}
void setBlackColor()
{
currentColor = Qt::black;
update();
}
void setGreenColor()
{
currentColor = Qt::green;
update();
}
void setYellowColor()
{
currentColor = Qt::yellow;
update();
}
void toggleFillShape()
{
fillShape = !fillShape;
update();
}
private:
QMenuBar *menuBar;
QMenu *colorMenu;
QMenu *fillMenu;
QStatusBar *statusBar;
QAction *blackAction;
QAction *greenAction;
QAction *yellowAction;
QAction *fillAction;
QColor currentColor;
bool fillShape;
};
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyWidget widget;
widget.show();
return app.exec();
}
```
在上述代码中,我们新增了 createActions、createMenus 函数来创建 Color 菜单和 Fill 菜单的相关操作。同时,我们重写了 paintEvent 函数,在窗体上绘制一个矩形,根据当前选中的颜色和填充状态进行绘制。
注意:在 main 函数中,我们创建了 MyWidget 对象,并显示出来。你可以根据需要对窗体进行大小调整。