Qt子窗口背景色继承问题

42 篇文章 1 订阅
17 篇文章 0 订阅

有时我们需要在QWidget中再嵌入子QWidget,且要求设置父QWidget的背景色,而子QWidget的背景色不变.于是我们写出了下面的代码

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QWidget *pw =new QWidget();
    pw->setStyleSheet("background-color:red;");// 设置背景色
       QPushButton *sw1 =new QPushButton("http://www.langisle.com/blog", pw);
 
 
       QWidget *sw2=new QWidget(pw);    
 
 
       QVBoxLayout *layout =new QVBoxLayout();
     layout->addWidget(sw1);
     layout->addWidget(sw2);
     pw->setLayout(layout);
     pw->resize(300,200);
     pw->show();
      return app.exec();
}
 
 

然而运行结果不对,子窗口继承了父窗口的背景颜色,效果如下图


我们修改一下代码,让setStyleSheet只作用于父窗口

int  main ( int  argc,  char ** argv )
{‍
 QApplication app ( argc, argv ) ;‍
   QWidget  * pw  = new  QWidget ( ) ;
  pw - > setObjectName ( "pw" ) ; // 设置对象句,相当于css里的id
  pw - > setStyleSheet ( "#pw{background-color:red;}" ) ; // 设置id对应元素的背景色‍

   QPushButton  * sw1  = new  QPushButton ( "http://www.langisle.com/blog" , pw ) ;
   QWidget  * sw2 = new  QWidget ( pw ) ;‍
   
   QVBoxLayout  * layout  = new  QVBoxLayout ( ) ;‍
   layout - > addWidget ( sw1 ) ;‍
   layout - > addWidget ( sw2 ) ;‍
   pw - > setLayout ( layout ) ;
   pw - > resize ( 300 , 200 ) ;‍
   pw - > show ( ) ;
   return  app. exec ( ) ;
}

再看显示效果,按钮的背景色对了,可sw2还是看不到,这是为什么呢

实际这种结果并不是继承了父窗口背景色,而是由于了窗口的背景色没有刷新,使用setAutoFillBackground让sw2自动刷新背景

int  main ( int  argc,  char ** argv )
{‍‍
 QApplication app ( argc, argv ) ;
   QWidget  * pw  = new  QWidget ( ) ;
   pw - > setObjectName ( "pw" ) ; // 设置对象句,相当于css里的id
   pw - > setStyleSheet ( "#pw {background-color:red;}" ) ; // 设置id对应元素的背景色

   QPushButton  * sw1  = new  QPushButton ( "http://www.langisle.com/blog" , pw ) ;‍
   QWidget  * sw2 = new  QWidget ( pw ) ;
    sw2 - > setAutoFillBackground ( true ) ; // 自动刷新背景
  
     QVBoxLayout  * layout  = new  QVBoxLayout ( ) ;‍
 layout - > addWidget ( sw1 ) ;‍
 layout - > addWidget ( sw2 ) ;‍
 pw - > setLayout ( layout ) ;
 pw - > resize ( 300 , 200 ) ;
 pw - > show ( ) ;‍
    return  app. exec ( ) ;
}

最终显示效果如下




### 回答1: 在Qt中设置窗口非常简单,只需要调用 QWidget::setParent() 函数即可。你可以使用QWidget::setWindowFlags() 函数来设置窗口属性,例如设置它是否可见、是否可以被移动或者调整大小等。 ### 回答2: 在Qt中,可以使用QMainWindow作为主窗口,然后在主窗口中添加窗口。 首先,在主窗口类中定义窗口的指针,并在构造函数中进行初始化。例如: ``` class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); private: QDialog *childWindow; }; ``` 然后,在构造函数中创建窗口并设置相关属性,例如窗口标题、大小以及窗口模式: ``` MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { // 创建窗口对象 childWindow = new QDialog(this); // 设置窗口的标题 childWindow->setWindowTitle("窗口"); // 设置窗口的大小(可选) childWindow->resize(400, 300); // 设置窗口窗口模式(可选) childWindow->setWindowFlags(Qt::Dialog); } ``` 接下来,可以在主窗口中添加一个按钮,并在按钮的槽函数中显示窗口: ``` QPushButton *button = new QPushButton("打开窗口", this); connect(button, &QPushButton::clicked, this, [this]() { childWindow->show(); }); ``` 当点击该按钮时,窗口将会显示在主窗口中。 需要注意的是,在Qt中,窗口的具体实现可以是QDialog、QWidget或其他继承自QWidget的类,根据实际需求进行选择。同时,还可以根据具体需求设置窗口属性和样式,例如窗口模式、背景颜色等。 总结起来,通过在主窗口类中创建窗口的指针,并在构造函数中设置窗口的相关属性,最后在需要显示窗口的地方调用show()函数即可在Qt中设置窗口。 ### 回答3: 在Qt中设置窗口可以通过以下步骤实现: 1. 创建一个新的QWidget对象作为窗口,可以使用QWidget类或其派生类(如QDialog)来创建。例如: ``` QDialog *childWindow = new QDialog(this); ``` 2. 设置窗口属性和样式,例如设置窗口标题、大小和位置等。可以使用setWindowTitle()、setFixedSize()和move()等窗口对象的方法来设置。例如: ``` childWindow->setWindowTitle("窗口"); childWindow->setFixedSize(400, 300); childWindow->move(100, 100); ``` 3. 将窗口显示出来。可以使用show()方法来显示窗口,或者使用exec()方法以模态方式显示窗口。例如: ``` childWindow->show(); // 以非模态方式显示窗口 // 或者 childWindow->exec(); // 以模态方式显示窗口 ``` 以上是创建并显示窗口的基本步骤。但实际上,还有其他一些设置窗口的方法和属性,如设置窗口的布局、添加窗口中的控件、连接窗口的信号和槽等,这些都可以根据具体的需求进行进一步设置和操作。例如,可以使用QVBoxLayout或QGridLayout设置窗口的布局,使用addWidget()将控件添加到布局中,使用connect()连接控件的信号和槽等。 总之,在Qt中设置窗口需要创建一个QWidget对象或其派生类的实例,设置其属性和样式,然后显示出来。根据具体需求,还可以进一步设置窗口的布局和控件等。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值