当我的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(){}
};
问题在于调用调整大小时,不再显示其圆角矩形蒙版,如下图所示:
调用调整大小之前的应用程序(注意圆角) 调用调整大小后的应用(注意缺少圆角)答案 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示例 上的Qt文档