您当前的位置: 首页 >  ui

命运之手

暂无认证

  • 1浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【零基础学QT】【026】QWidget,QWindow,UI指针

命运之手 发布时间:2019-10-28 22:35:17 ,浏览量:1

? QWidget

  • QWidget是所有QT控件的基类,包括按钮,窗口,对话框等,全部继承自QWidget
  • QWidget类包含一个parent指针,这个指针也是QWidget类型,表示QWidget的上级界面对象。当parent为空时,QWidget即是顶级窗口,会显示窗口标题,按钮和边框。当parent非空时,QWidget则会成为parent中的控件,或是对话框,子窗口。
  • 当parent窗口被关闭时,子窗口也会跟随关闭

? QMainWindow

  • QMainWindow继承自QWidget,它设计出来是专门用作主窗口使用的,而QWidget技能做窗口,又能做控件
  • QMainWindow默认已经封装了一个的常用的窗口布局,可以快捷地添加菜单栏,工具栏,状态栏,悬停面板等窗口组件,并且为他们已经设置好了默认的布局位置

? UI指针:连接QMainWindow与UI文件 QtCreator在创建UI界面文件时,可以自动帮我们生成一个Window类,Window类会自动加载UI文件中的控件和布局,现在我们来说明,Window类是如何自动创建界面的

  • QtCreator会根据UI文件自动生成一个界面管理工具类,比如名为homewindow.ui的界面文件,编译时会生成名为Ui::HomeWindow的界面管理工具类
  • Ui::HomeWindow类中,有一个setupUi(*QMainWindow)方法,会自动将UI文件中的界面和布局添加到QMainWindow对象中,并保留了所有控件和布局的指针,以便快速访问
  • QtCreator会帮我们生成一个名为HomeWindow的窗口类,它继承自QMainWindow
  • 注意HomeWindow同Ui::HomeWindow的区别,他们虽然同名,但是命名空间不同,并不是同一个类,HomeWindow是一个窗口类,而Ui::HomeWindow是一个工具类,它并不是窗口
  • HomeWindow类中包含一个ui指针,它指向一个Ui::HomeWindow对象,通过调用ui->setupUi(this),即可将UI文件中的界面和布局自动加载到自己身上

? 加载UI文件 我们还可以手动加载一个UI文件,来得到一个QWidget对象 这种技术适用于窗口内容不确定,需要动态从文件加载界面的情况 当我们想在不同界面中复用同一个子界面时,也可以使用这种技术


	#include 
	#include 
	#include 
	#include 
	#include 
	
	int main(int argc, char *argv[]) {
	    QApplication a(argc, argv);
	
	    //通过UI文件加载一个QWidget控件
	    QUiLoader loader;
	    QFile file("E:/ws-qt/02/customwidget.ui");
	    file.open(QFile::ReadOnly);
	    QWidget *customWidget = loader.load(&file);
	    file.close();
	
	    //显示
	    customWidget->setGeometry(0, 0, 800, 600);
	    customWidget->show();
	
	    //获取子控件
	    QPushButton *pushButton = customWidget->findChild("pushButton");
	    pushButton->setGeometry(0, 0, 200, 100);
	    pushButton->setText("Load UI File");
	
	    return a.exec();
	}

? 创建窗口 通过以上讲解我们知道,通过QWidget,QWindow,UI文件都可以创建窗口 每种方式都有自己的优缺点,在实际应用中,我们应当根据不同方式的特点来灵活运用

? 示例代码


	#include 
	#include 
	
	#include "mainwindow.h"
	#include "ui_homewindow.h"
	
	int main(int argc, char *argv[]) {
	    QApplication a(argc, argv);
	
	    // QWidget是所有窗口和控件的基类
	    // 如果QWidget没有指定parent,则为顶级控件,会显示窗口和标题
	    QWidget *w1 = new QWidget();
	    w1->setWindowTitle("Top Widget");
	    w1->show();
	
	    // 如果QWidget指定了parent,则会显示在parent控件内,并隐藏窗口和标题
	    QPushButton *w2 = new QPushButton(w1);
	    w2->setGeometry(0, 0, 400, 300);
	    w2->setStyleSheet("background:red;");
	    w2->setWindowTitle("Child Widget");
	    w2->show();
	
	    // QMainWindow是一个专门的窗口类,它集成自QWidget
	    // QMainWindow默认已经设置好了窗口布局,并封装了添加菜单栏,工具栏,状态栏,悬停面板的快捷方法
	    // 通过setMenuBar,addToolBar等方法,即可快捷地将控件添加到对应位置
	    QMainWindow *w3 = new QMainWindow();
	    QStatusBar *statusBar = new QStatusBar();
	    statusBar->setGeometry(0, 0, 1000, 50);
	    statusBar->setStyleSheet("background:yellow;");
	    w3->setStatusBar(statusBar);
	    w3->setWindowTitle("MainWindow");
	    w3->show();
	
	    // QtCreator会自动根据ui文件,帮我们生成一个界面工具类
	    // 这个工具类可以将ui文件中的界面和布局,通过setupUi方法自动添加到QMainWindow中
	    // 比如homewindow.ui文件,编译后会生成一个Ui::HomeWindow工具类
	    // 我们通过QtCreator创建ui文件时,QtCreator可以自动帮我们生成一个窗口类,并自动设置好界面
	    // 其原理,实质就是创建了QMainWindowd的继承类,并通过ui工具类来自动填充界面
	    QMainWindow *w4 = new QMainWindow();
	    Ui::HomeWindow *ui = new Ui::HomeWindow();
	    ui->setupUi(w4);
	    w4->setWindowTitle("MainWindow with UI");
	    w4->show();
	
	    return a.exec();
	}

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0868s