重新应用时,调用Qt MainWindow掩码似乎不起作用

时间:2014-09-03 11:19:23

标签: qt

当我的Qt应用程序首次启动时,它使用圆角矩形来掩盖主窗口的一部分。然而,随后调整此蒙版的大小,同样是圆角矩形,如下面的MWE所示

class AppUI : public QMainWindow
{
    Q_OBJECT

public:
    AppUI( QWidget *parent = 0 , Qt::WFlags flags = 0 ) : QMainWindow( parent , flags )
    {
        resize( 600 , 400 );
        QWidget *centralWidget = new QWidget( this );
        setCentralWidget( centralWidget );
        setWindowFlags( Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint | Qt::FramelessWindowHint );

        // Create mask -- hides half of the UI
        QBitmap bitmap( this->size() );
        bitmap.clear();
        QPainter painter( &bitmap );
        painter.setBrush(QColor(Qt::black) );
        painter.setPen(QColor(Qt::black));
        painter.drawRoundedRect( 0 , 0 , 600 , 200 , 20.0f , 20.0f , Qt::AbsoluteSize );
        setMask( bitmap );
    }

    void displayEntireUi() // called after QApplication::show()
    {
        QBitmap bitmap( this->size() );
        bitmap.clear();
        QPainter painter( &bitmap );
        painter.setBrush(QColor(Qt::black) );
        painter.setPen(QColor(Qt::black));
        painter.drawRoundedRect( geometry() , 20.0f , 20.0f , Qt::AbsoluteSize );
        setMask( bitmap );  
    }

    ~AppUI(){}
};

问题在于调用调整大小时,不再显示其圆角矩形蒙版,如下图所示:

调用调整大小之前的应用程序(注意圆角) enter image description here

调用
调整大小后的应用(注意缺少圆角) enter image description here

2 个答案:

答案 0 :(得分:1)

我想我找到了原因。 QWidget::geometry()似乎返回窗口尺寸的大小,包括窗口标题,边框等.OTOH QWidget::geometry()::size()似乎返回中心窗口小部件的宽度和高度,这正是我想要的。因此,displayEntireUi()的以下更改似乎可以解决问题

QSize size = geometry().size(); 
// QSize size = this->size();   // Alternatively 
painter.drawRoundedRect( 0 , 0 , size.width() , size.height() , 20.0f , 20.0f , Qt::AbsoluteSize );

答案 1 :(得分:-1)

将此代码放在QMainWindow :: paintEvent()处理程序中,如下所示

class MyWidget : public QWidget{
public: 
  MyWidget(QWidget *parent = 0) : QWidget(parent){}
protected:
  void paintEvent(QPaintEvent *pe){
     QBitmap bitmap( this->size() );
        bitmap.clear();
        QPainter painter( &bitmap );
        painter.setBrush(QColor(Qt::black) );
        painter.setPen(QColor(Qt::black));
        painter.drawRoundedRect( geometry() , 20.0f , 20.0f , Qt::AbsoluteSize );
        setMask( bitmap ); 
  }

请参阅Qt

提供的AnalogClock示例

QWidget::paintEvent()

上的Qt文档