Qt中怎样将widget 添加到mainwindow?

Qt中怎样将widget 添加到mainwindow?,第1张

在Qt中,要将一个QWidget(包括QMainWindow)添加到另一个QWidget中,可以使用setCentralWidget()方法。

下面是一个简单的示例代码,演示如何将一个QWidget添加到QMainWindow中:

#include <QMainWindow>#include <QWidget>int main(int argc, char *argv[]){    QApplication app(argc, argv)   // 创建一个QMainWindow对象

QMainWindow *mainWindow = new QMainWindow()   // 创建一个QWidget对象

QWidget *myWidget = new QWidget(mainWindow)   // 将myWidget设置为mainWindow的中心窗口部件

mainWindow->setCentralWidget(myWidget)   // 显示主窗口

mainWindow->show()   return app.exec()

}

在这个示例中,我们首先创建了一个QMainWindow对象,然后创建了一个QWidget对象,并将它的父对象设置为QMainWindow。接着,我们使用setCentralWidget()方法将QWidget对象设置为QMainWindow的中心窗口部件。最后,我们显示了QMainWindow。

通过这种方法,我们就可以将一个QWidget添加到QMainWindow中。

Qt中的每个类,都有一个对应的同名头文件,其中包含其类定义。例如要使用QApplication类,则需要在程序中添加" #include <QApplication>"

QApplication类用于管理应用程序范围内的资源。其构造函数需要main函数的argc和argv作为参数。

widget被创建时都是不可见的(always created hidden)。widget中可容纳其它widget。 Qt中的widget在有用户行为或状态改变时会emit signal。 signal可以和slot函数连接在一起(connect),这样当有signal被emit时,对应的slot函数会被自动调用。

QWidget类的构造函数需要一个 QWidget * 指针作为参数,表示其parent widget(默认值为0,即不存在parent widget)。在parent widget被删除时,Qt会自动删除其所有的child widget。

Qt中有三种Layout Manager 类: QHBoxLayout,QVBoxLayOut,QGridLayOut。基本模式是将widget添加进LayOut,由Layout自动接管widget的尺寸和位置。

启动Qt程序时可以通过 -style 参数改变程序的默认显式风格。 Chapter 2 Creating Dialogs 2.1 Subclassing Dialog

Qt中所有dialog的基类是QDialog。QDialog派生自QWidget。

Qt中所有定义了signal或slot的类,在其类定义的开始处都要使用Q_OBJECT宏。Qt中的signal关键字实际上是宏定义。类似的,slots关键字也是宏定义。

Qt所提供的类分为若干模块:QtGui,QtNetWork,QtOpenGL,QtSql, QtSvg和QtXml等。 QObject::tr() 函数将输入的字符串转换为其他语言(国际化)。对所有用户可见的字符串都使用tr()函数是一个良好的习惯。

Buddy:两个widget A和B,若A拥有快捷键,当用户按下该快捷键时,程序的输入焦点自动转移到B上,则称B是A的buddy。

QWidget::close() 是一个slot,其默认行为是使对应的widget隐藏不可见,但并不删除该widget。 Layout 中可包含widget和其他layout。通过嵌套使用QHBoxLayOut、QVBoxLayOut、

QGridLayOut,可以构造非常复杂的dialog。值得注意的是:layout manager 类并不属于widget。实际上,它派生自QLayout,而QLayout又派生自QObject。

QWidget::sizeHint() 返回一个widget()的理想大小(ideal size)。 emit关键字是Qt特有的,用于产生signal。

wk_ad_begin({pid : 21})wk_ad_after(21, function(){$('.ad-hidden').hide()}, function(){$('.ad-hidden').show()})

MOC(Meta-Object-Compiler): 对于所有使用了Q_OBJECT宏的类,在编译时都需要通过MOC的处理,否则会出现链接错误。解决该错误的办法也很简单,重新执行qmake以更新makefile,然后重新编译。

2.2 Signal and Slot in Depth Signal &Slot 机制是Qt的根基。

Slot和普通的C++类成员函数几乎完全一致;可以是virtual的,可以被重载,可以是public、protected或private的,而且也可所以被其他成员函数直接调用。

signal与slot之间的关联可以是一对一、一对多或多对一。

signal和signal之间也可以被关联,此种情况与signal-slot的区别在于,当第一个sigal被emit时,第二个signal也被emit。

可以调用disconnect()来解除signal 与slot之间的关联,通常情况下很少需要显式调用disconnect(),因为对象被删除时Qt会自动移除与其相关的关联。

sigal-slot或signal-signal这样的关联,要求二者具备相同的参数列表;若signal比slot中的参数多,多余的参数会被忽略。

思维定势:signal-slot机制只能用于widget。实际上signal-slot机制是由QObject实现的,并不仅局限于GUI编程,可以用于任何QObject子类。

2.3 Rapid Dialog Design

使用Qt Designer创建的form最终被转换为C++代码。

qmake工具能够检测到interface file(*.ui files),并调用uic,即Qt的user interface compiler。uic将.ui文件转换为C++代码,并存放在形式为ui_xxx.h的文件中。该文件中给出了dialog对应类的完整定义,并包含一个 setupUi()成员函数,用于初始化form。

注意,由uic创建的这个类未派生自任何Qt class。

Qt的 parent-child机制是由QObject实现的。当创建一个对象时若指定了parent,则parent将该对象添加至其 childern list。当parent被删除时,Qt会遍历其childern list并删除每个child,该过程会递归进行。这一机制极大的简化了内存管理,降低了内存泄露的风险——程序员只需显式的删除通过new创建并且没有parent的对象。

对于widget,parent还有一层附加的意义:chidl widget 是显示在parent widget的范围之内的。如果删除parent widget,不仅child widget从内存中被释放,在屏幕上也会消失。

QDialog::accept() 将dialog的返回值设为QDialog::Accepted(值为1),而QDialog::reject()将返回值设为QDIalog::Rejected(值为0)。

2.5 Dynamic Dialogs

Dynamic Dialog指的是程序在运行时根据.ui文件创建的dialog。这样的dialog不是通过uic将.ui转换为C++代码,而是在运行时使用QUiLoader类装载.ui文件。

可以使用QObject::findChild<T>()来访问form的child widget。

要使用QUiLoader,需要在Qt程序的.pro文件中添加以下内容: CONFIG += uitools Dynamic dialog允许在不重新编译程序的前提下更改form的布局。 Chapter 3 Creating Main Windows 3.1 Subclassing QMainWindow

应用程序的主窗口是通过创建QMainWindow的派生类来完成的。QMainWindow和QDialog一样,都是派生自QWidget。

closeEvent()是由QWidget提供的一个虚函数,在用户关闭窗口时会被自动调用。

setCentralWidget()将某个Widget设置为主窗口的central widget, 而central widget意味着在显示时会占据主窗口的中央位置。

Qt下的GUI 编程支持多种图形格式。可以使用多种方式为应用程序提供图像,最常见的包括: 1). 将图像存储在文件中,运行时加载之。

2). 在源码中include XPM文件(XPM文件也是合法的C++文件)。 3). 利用Qt的资源机制。

Qt的资源机制比之运行时加载更方便,并对所有支持的图像格式都能良好工作。

为了利用Qt的资源机制,需要创建一个资源文件,并在.pro文件中对应添加一行来对资源文件进行标识。例如:

RESOURCES= spreadsheet.qrc

资源文件本身采用了简单的XML格式。它被编译进程序的可执行文件,因此不会被丢失。在对资源进行定位时,使用路径前缀":/",例如“ :/images/icon.png "。资源本身可以是任何类型的文件。

3.2 Creating Menus and Toolbars

Qt通过引入Action这一概念简化了对menu和toolbar的编程。一个Action可以被添加到任意数量menu和toobar中。

在Qt中对menu和toolbar的编程涉及到三个步骤: 1). 创建并设置Action

2). 创建menu,并在其中添加Action 3). 创建toolbar,并在其中添加Action

Action的创建是通过QAction类来实现的,对每个Action,可以为其设置accelerator,parent,shortcut key, 可见性以及status tip等属性,并可以通过调用connect()为ACtion设置被触发要执行的 *** 作。

QTableWidget的基类QAbstraceItemView提供了selectAll()这个slot。

QApplication类提供了aboutQt()这个slot,可以通过全局变量qApp(一个类型为QApplication *的指针)来使用之。

准备

首先 你得有个正常的app项目(这是必须的 extension必须依附于某个app中 当然 不这样 你也无法单独安装某个widget)

打开项目工程 选择新建一个target 在 Application Extension 中选择today exntension 然后填入名字 确认即可

这时你的项目里多个一个target 同时也多了下面

接下来 删掉这个讨厌的 MainInterface.storyboard 然后修改plist文件中的 NSExtension 字段

删掉 NSExtensionMainStoryboard 字段

添加 NSExtensionPrincipalClass 字段 并设为TodayViewController (你也可以指定其他的ViewController)

修改完以后 Widget就可以开始编译运行了

运行

关于调试Widget 我推荐使用模拟器而不用真机 因为在研究过程中我发现真机调试的效果非常差 经常提示无法连接到手机(也有可能是5S的性能够不?) 导致无法正常的debug 或者无法reinstall 而模拟器则好点(至少能顺利的打印出log) 但是每次修改好代码以后 最好都先退出模拟器 再重新编译运行 如果你退出重新运行时提示下面这个错误 不用怕 多运行两次就ok了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11557800.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存