【问题标题】:Custom-shaped QWidgets disappearing自定义形状的 QWidgets 消失
【发布时间】:2013-06-11 12:50:25
【问题描述】:

我没有成功尝试修改 Qt 的 WindowFlags 示例以获得自定义小部件。起初它似乎很容易,但我不明白为什么它不起作用。

示例的唯一添加在 PreviewWindow 类的构造函数中:

QVector<QPoint> pts;

pts.push_back(QPoint(0, 10));
pts.push_back(QPoint(36, 10));
pts.push_back(QPoint(36+10, 0));
pts.push_back(QPoint(36+20, 10));
pts.push_back(QPoint(296, 10));
pts.push_back(QPoint(296, 266));
pts.push_back(QPoint(0, 266));

QPolygon p(pts);

setMask(QRegion(pts));

现在,当我运行这个添加的示例时,我没有得到一个好看的窗口。但是,这不是我想要的:这些坐标仅指 Qt::Tool 类型的窗口。

形状作为工具还可以(试一试),但现在我想摆脱窗框。不幸的是,整个窗口在绝望中消失了。

我该怎么办?

【问题讨论】:

    标签: qt qt4 widget qwidget


    【解决方案1】:

    我不知道为什么会这样,但就是这样。

    首先,设置标志后,一个小部件会消失,但我很放松,因为控制器窗口中的代码在设置标志后立即调用PreviewWindow::show()(在ControllerWindow::updatePreview()中)。

    但是,我们需要在 PreviewWindow 类中设置标志后立即调用 show ,如下所示:

    void PreviewWindow::setWindowFlags(Qt::WindowFlags flags)
    {
        QWidget::setWindowFlags(flags);
    
        // This is necessary to show the window again
        show();
    
        QString text;
    
        Qt::WindowFlags type = (flags & Qt::WindowType_Mask);
        if (type == Qt::Window) {
            text = "Qt::Window";
        } else if (type == Qt::Dialog) {
            text = "Qt::Dialog";
        } else if (type == Qt::Sheet) {
            text = "Qt::Sheet";
        } else if (type == Qt::Drawer) {
            text = "Qt::Drawer";
        } else if (type == Qt::Popup) {
            text = "Qt::Popup";
        } else if (type == Qt::Tool) {
            text = "Qt::Tool";
        } else if (type == Qt::ToolTip) {
            text = "Qt::ToolTip";
        } else if (type == Qt::SplashScreen) {
            text = "Qt::SplashScreen";
        }
    
        if (flags & Qt::MSWindowsFixedSizeDialogHint)
            text += "\n| Qt::MSWindowsFixedSizeDialogHint";
        if (flags & Qt::X11BypassWindowManagerHint)
            text += "\n| Qt::X11BypassWindowManagerHint";
        if (flags & Qt::FramelessWindowHint)
            text += "\n| Qt::FramelessWindowHint";
        if (flags & Qt::WindowTitleHint)
            text += "\n| Qt::WindowTitleHint";
        if (flags & Qt::WindowSystemMenuHint)
            text += "\n| Qt::WindowSystemMenuHint";
        if (flags & Qt::WindowMinimizeButtonHint)
            text += "\n| Qt::WindowMinimizeButtonHint";
        if (flags & Qt::WindowMaximizeButtonHint)
            text += "\n| Qt::WindowMaximizeButtonHint";
        if (flags & Qt::WindowCloseButtonHint)
            text += "\n| Qt::WindowCloseButtonHint";
        if (flags & Qt::WindowContextHelpButtonHint)
            text += "\n| Qt::WindowContextHelpButtonHint";
        if (flags & Qt::WindowShadeButtonHint)
            text += "\n| Qt::WindowShadeButtonHint";
        if (flags & Qt::WindowStaysOnTopHint)
            text += "\n| Qt::WindowStaysOnTopHint";
        if (flags & Qt::CustomizeWindowHint)
            text += "\n| Qt::CustomizeWindowHint";
    
        textEdit->setPlainText(text);
    }
    

    所以,一条简单的线,放在一个奇怪的地方。关于为什么会发生这种情况的任何提示?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 2017-03-05
      • 2015-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多