1

我对 Qt 框架有点陌生,所以在其中一项要求中有点挣扎。

我们必须在按钮单击时淡化主窗口,然后弹出确认消息。这样,只有弹出消息应该是可见的,而背景应该是不透明的。

目前在单击按钮时显示消息,背景变得不透明。但是窗口中的其他小部件仍然很突出。

下面是 Ok Button 的 Click 事件的代码片段

void MainWindow::OkClicked()
{
  QGraphicsOpacityEffect*   effect01  = new QGraphicsOpacityEffect();
  effect01->setOpacity(0.2);
  this->setGraphicsEffect(effect01);
  MessageDialog->updateStyles(); //Pop-up message Box
  MessageDialog->show();
}

如果我们单独为所有小部件设置不透明度,则一种方法可以是。但这不是一个好的设计。任何指导都受到高度赞赏。

4

1 回答 1

3

可以创建一个包含小部件并添加一个带有背景颜色属性和 alpha 属性的 QSS 样式。然后将布局添加到包含小部件以组织嵌套小部件的布局。我使用这种技术来实现透明效果,同时保持嵌套控件的不透明度。这是一些示例代码:

setAttribute(Qt::WA_NoSystemBackground, true);
// set the parent widget's background to translucent
setAttribute(Qt::WA_TranslucentBackground, true);

setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
// create a display widget for displaying child widgets
QWidget* displayWidget = new QWidget;
displayWidget->setGeometry(0, 0, this->width(), this->height());
displayWidget->setStyleSheet(".QWidget { background-color: rgba(0, 0, 0, 75%); border-width: 1px; border-style: solid; border-radius: 5px; border-color: #555555; } .QWidget:hover { background-color: rgba(68, 68, 68, 75%); border-width: 2px; border-style: solid; border-radius: 10px; border-color: #ffffff; }");

QLabel* icon = new QLabel;
icon->setPixmap(pixmapIcon);
icon->setMaximumSize(32, 32);
QLabel* header = new QLabel;
header->setMaximumSize(225, 50);
header->setWordWrap(true);
header->setText(headerText);
header->setStyleSheet("QLabel { color: #ffffff; font-weight: bold; font-size: 12px; }");
QLabel* message = new QLabel;
message->setMaximumSize(225, 100);
message->setWordWrap(true);
message->setText(messageText);
message->setStyleSheet("QLabel { color: #ffffff; font-size: 10px; }");
QHBoxLayout* displayMainLayout = new QHBoxLayout;
displayMainLayout->addWidget(icon);
QVBoxLayout* vl = new QVBoxLayout;
vl->addWidget(header);
vl->addWidget(message);
displayMainLayout->addLayout(vl);
displayWidget->setLayout(displayMainLayout);

QHBoxLayout* containerLayout = new QHBoxLayout;
containerLayout->addWidget(displayWidget);
setLayout(containerLayout);

show();

此代码直接取自我的 Qt Tray Notification Manager 项目。您可以在此处查看完整代码以获取一些上下文:https ://github.com/pcmantinker/Tray-Notification-System

请注意,如果您熟悉 CSS,则 QSS 非常相似。如果您想以某种方式设置所有 QWidget 的样式,您将使用 QWidget 选择器。但是,如果您只想设置特定 QWidget 的样式,请使用 .QWidget 选择器。为所有 QWidget 设置样式将使每个可见的 QWidget 继承相同的属性,因为每个 UI 元素都派生自 QWidget。在构建样式时请记住这一点。这是对 QSS 的参考:http: //qt-project.org/doc/qt-4.8/stylesheet.html

以下是它外观的一些示例图像:
Windows 7
Windows 7的
Mac OS X Lion
Mac OS X 狮子
Ubuntu
Ubuntu
我希望这会有所帮助。如果您有任何问题,请告诉我。

于 2012-10-01T17:49:19.083 回答