Qt自定义窗口部件
QT添加带有滚动条的窗口,并使之滚动起来
QT添加带有滚动条的窗⼝,并使之滚动起来QT ui designer中提供了⼀个叫做QScrollBar的控件,但这导致了⼈们的⼀个误区,就是必须要使⽤这个控件,才能使窗⼝滚动起来虽然可以通过这个控件来达到⽬的,但是需要⾃⼰去绑定和窗⼝滚动的⼀些信号和槽函数,⾮常⿇烦。
因此,我们通常选择另⼀种⽅案来实现窗⼝滚动:QScrollArea控件。
这个控件⾃带了滚动条,我们只需要在使⽤前设置好这个控件的⼀些参数即可。
这个控件⾃带了⼀个⼦控件:QWidget:scrollAreaWidget。
我们需要对这个控件的⼀些参数进⾏设置。
要想看到滚动条的⼀个必要条件就是scrollAreaWidget的尺⼨⼤于scrollArea。
这⾥我们可以看到,两个控件尺⼨都相同,此时运⾏程序,是不会看到右边有垂直滚动条的我们修改scrollAreaWidget的尺⼨⾼度为1000再次运⾏程序结果还是没有垂直滚动条,这是什么原因呢?因为QScrollArea在Qt designer中有⼀个属性:WidgetResizable。
它的默认属性为true(勾选),false(未勾选)我们需要取消这个钩,将其属性设置为false,之后再次运⾏程序这是就可以看到右边出现了滚动条,此时出现的滚动条已经可以通过⿏标滚轮,⿏标左键拖拽,点击来控制显⽰区域了,都不需要⾃⼰去实现什么函数。
和QScrollBar相⽐,简直不要太⽅便。
但是,再界⾯上需要动态添加控件的时候,给scrollAreaWidget设置⼀个固定的尺⼨就不合适了,因为当控件的坐标超出scrollAreaWidget的尺⼨时,依然⽆法显⽰此时,就需要在动态⽣成控件的时候添加⼀个判断,判断控件的位置+尺⼨是否超出了scrollAreaWidget的显⽰范围,如果超出,则需要使⽤函数ui->scrollAreaWidget->setGeometry(0, 0, 340, ui->scrollAreaWidget->height()+30);动态的设置scrollAreaWidget的尺⼨⼤⼩,这样就能保证⽆论⽣成多少动态控件,始终都在scrollAreaWidget范围内,⽽且可以通过滚动条滚动来显⽰不同区域的控件补充使⽤代码添加滚动区域的⽅法⾸先在界⾯上随便放置⼀个容器,我们这⾥放置了⼀个groupbox然后在头⽂件中添加如下代码QHBoxLayout *layout;QScrollArea *scrollarea;QWidget *scrollareacontent;然后在构造函数中添加如下代码Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);scrollarea = new QScrollArea(ui->groupBox);scrollarea->setWidgetResizable(true);scrollarea->setGeometry(0,0,ui->groupBox->width(),ui->groupBox->height());layout = new QHBoxLayout(ui->groupBox);scrollareacontent = new QWidget(ui->groupBox);scrollareacontent->setLayout(layout);scrollarea->setWidget(scrollareacontent);}注意,这⾥设置的⽗对象是ui->groupbox,就是我们前⾯添加在主界⾯上的groupbox控件然后添加按钮槽函数,实现点击⼀个按钮就在groupbox中添加⼀个新按钮的功能,准确的说,应该是在scrollareacontent中添加新的按钮void Widget::on_pushButton_clicked(){QPushButton *btn = new QPushButton(scrollareacontent);btn->setMinimumSize(btn->size());layout->addWidget(btn);}新建按钮的时候,它的⽗对象是scrollareacontent,如果是别的⽗对象,滚动条将不会⽣效。
QT习题
QT习题一、名词解释1、虚函数:2、回调函数:3、内联函数:4、信号与插槽:5、私有函数:6、构造函数:7、公有函数:8、内联函数:9、信号与插槽:10、析构函数:二、判断题1、在QT中Qwidget不可以作为应用程序的窗口()。
2、在创建窗口部件的时候,窗口部件通常不会显示出来()。
3、布局管理器不是一个窗口部件()4、FindDialog(QWidget *parent = 0);父参数为NULL,说明有父控件。
()5、show()显示的对话框是模式对话框。
用exec()显示的对话框是无模式对话框。
()6、布局管理器派生自QObject。
()7、Q_OBJECT是一个宏定义,如果类里面用到了signal或者slots,就必须要声明这个宏。
()8、FindDialog(QWidget *parent = 0);父参数为NULL,说明没有父控件。
()9、槽可以是虚函数,可以是公有的,保护的,也可是私有的。
()10、show()显示的对话框是无模式对话框。
用exec()显示的对话框是模式对话框。
()三、简答题1、简述一下信号与插槽机制。
2、简述布局管理器的功能,列举3个布局管理器。
3、简述使用Qt设计师,在创建对话框时主要包含哪几个基本步骤?4、GUI程序通常会使用很多图片,请简述3种提供图片的方式。
5、列举几种Qt中会产生绘制事件的情况。
6、Update()与repaint()之间的区别?7、对窗体上的控件进行布局管理一般有哪几种方式,简述一下其缺点。
8、简述事件和信号的特点和区别。
9、简述主函数中创建QApplication对象功能。
10、简述使用Qt设计师,在创建对话框时总是包含哪几个基本步骤?11、简述布局管理的类QSplitter和QScrollArea的功能。
12、对窗体上的控件进行布局管理一般有哪几种方式,简述一下其缺点。
13、简述一下mousePressEvent() 与mouseMoveEvent()是什么事件,在什么情况下触发?14、在Qt设计师中集成自定义窗口部件有哪两种方法?介绍改进法的步骤。
Qt的第三章
(8) 向导对话框
略
5 其他窗口部件
(1) QFrame类族 包含QLabel、QLCDNumber、QSplitter、 QStackedWidget、QToolBox、 QAbstractScrollArea等。
公共属性: 通过设置FrameShape、FrameShadow、 LineWidth、MidLineWidth参数组合,形成 不同的效果。
(1)颜色对话框 QColorDialog 作用:用户可选择颜色并获得对应的值 方法一(使用类静态函数): QColor color=QColorDialog::getColor() 方法二(创建类对象):
QColorDialog dialog(Qt::red,this); dialog.setOption(QColorDialog::ShowAlphaChannel); dialog.exec(); QColor color = dialog.currentColor();
(2)文件对话框 QFileDialog 作用:用户选择文件或文件夹 打开文件: QFileDialog::getOpenFileName() 保存文件: QFileDialog::getSaveFileName()
(3)字体对话框 QFontDialog 作用:用户和选择字体 获得字体: QFont font = QFontDialog::getFont()
2)QCheckBox、QRadioButton、QGroupBox 常用函数: isChecked():判断是否被选中
注:一组单选框(RadioButton)常放置在 相同的GroupBox中,实现单选功能。
qt实现不规则窗口的方法
qt实现不规则窗口的方法一、前言Qt是一个强大的跨平台开发框架,它提供了丰富的API和工具,使得开发者能够轻松地创建各种类型的应用程序。
在Qt中,窗口是应用程序的重要组成部分,而不规则窗口的实现则可以让应用程序更加具有个性化和视觉吸引力。
本文将介绍如何使用Qt实现不规则窗口的方法。
二、不规则窗口的实现方法1. 使用自定义窗口类在Qt中,可以通过继承QMainWindow或QDialog类,并重写其中的一些方法来实现不规则窗口。
首先,需要定义一个自定义窗口类,并在其中重写windowRect()和sizeHint()方法,以获取窗口的尺寸和形状。
然后,可以使用setWindowFlags()方法来设置窗口的样式,以实现不规则窗口的效果。
2. 使用布局管理器Qt提供了多种布局管理器,如QHBoxLayout、QVBoxLayout、QGridLayout等,这些布局管理器可以根据需要自动调整窗口的大小和位置。
通过使用布局管理器,可以将不规则形状的窗口部件放置在窗口中,并自动调整窗口的大小和位置,以达到不规则窗口的效果。
3. 使用形状控件Qt提供了一些形状控件,如QFrame、QPushButton等,这些控件可以设置不同的形状,如矩形、圆形、椭圆形等。
通过将这些形状控件放置在窗口中,并使用布局管理器自动调整它们的位置和大小,可以实现不规则窗口的效果。
三、示例代码下面是一个简单的示例代码,展示了如何使用自定义窗口类和布局管理器实现不规则窗口:```cpp#include <QApplication>#include <QMainWindow>#include <QVBoxLayout>#include <QWidget>class IrregularWindow : public QWidget {public:IrregularWindow(QWidget *parent = nullptr) : QWidget(parent) {}void setShape(QRect rect) {m_shape = rect;update();}protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawRect(m_shape);}private:QRect m_shape;};int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget *centralWidget = new QWidget;QVBoxLayout *layout = new QVBoxLayout(centralWidget);QWidget *widget1 = new IrregularWindow;widget1->setWindowFlags(widget1->windowFlags() | Qt::FramelessWindowHint);widget1->setShape(QRect(50, 50, 200, 100));layout->addWidget(widget1);QWidget *widget2 = new QPushButton("Button");layout->addWidget(widget2);QWidget *widget3 = new QFrame(centralWidget);widget3->setFrameShape(QFrame::Rectangle);layout->addWidget(widget3);centralWidget->show();return app.exec();}```在上面的代码中,我们创建了一个自定义窗口类IrregularWindow,它继承自QWidget,并重写了paintEvent()方法来绘制自定义的形状。
QT新建一个窗口控制程序以实现添加按钮点击弹出信息提示框为例
QT新建一个窗口控制程序以实现添加按钮点击弹出信息提示框为例为了实现添加按钮点击弹出信息提示框的功能,我们可以使用Qt来创建一个窗口控制程序。
首先,我们需要创建一个Qt窗口应用程序项目。
在Qt Creator中选择"新建项目",然后选择"C++"和"Qt Widgets应用",填写项目名称和路径,然后点击"下一步"。
在下一个界面,可以选择使用预设的窗口模板。
选择一个适合的窗口模板,例如"MainWindow",然后点击"下一步"。
接下来,在"项目管理器"中,展开源文件夹,找到"mainwindow.cpp"文件。
双击打开该文件。
在"mainwindow.cpp"文件中,我们需要添加按钮和相应的点击事件。
如果不存在"MainWindow"类的构造函数,则需要手动创建构造函数。
我们可以在构造函数中添加按钮。
```cpp#include "mainwindow.h"#include "ui_mainwindow.h"#include <QMessageBox>MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)ui->setupUi(this);//创建按钮QPushButton *btn = new QPushButton("添加按钮", this);btn->setGeometry(100, 100, 100, 30);//连接按钮的点击事件到槽函数connect(btn, SIGNAL(clicked(), this, SLOT(showMessageBox());MainWindow::~MainWindowdelete ui;//槽函数:点击按钮弹出信息提示框void MainWindow::showMessageBoxQMessageBox::information(this, "提示", "按钮已点击");```在上面的代码中,我们首先在构造函数中创建了一个按钮,并设置了按钮的位置和尺寸。
Qt自定义控件之可伸缩组合框(GroupBox)控件
Qt⾃定义控件之可伸缩组合框(GroupBox)控件摘要本⽂基于QGroupBox扩展了⼀种可以伸缩的组合框,正常状态下,组合框处于收缩状态,内部的控件是隐藏的;需要的时候,可以将组合框进⾏伸展,并将内部控件显⽰出来。
正⽂实现的代码⽐较简单,主要有以下⼏点:1、该组合框继承于QGroupBox;2、通过QSS将QGroupBox的默认Check图标替换;3、通过QGroupBox的setFlat函数显⽰隐藏垂直边框4、使⽤时,设置⽗窗⼝的layout的SizeConstraint为SetFixedSize,否则否则在ExtendedGroupBox收缩时,⽆法动态调整⼤⼩。
代码如下:QSS样式:QGroupBox#ExtendedGroupBox::indicator{width: 8px;height: 8px;}QGroupBox#ExtendedGroupBox::indicator:unchecked{image: url(:/icons/uncheck.png);}QGroupBox#ExtendedGroupBox::indicator:checked{image: url(:/icons/check.png);}#ifndef EXTENDED_GROUP_BOX_H_#define EXTENDED_GROUP_BOX_H_#include <QGroupBox>#include <QVector>class ExtendedGroupBox : public QGroupBox{Q_OBJECTpublic:enum State{STATE_NORMAL,STATE_EXPAND};public:ExtendedGroupBox(QWidget *parent = nullptr, State state = STATE_NORMAL);ExtendedGroupBox(const QString &title, QWidget *parent = nullptr, State state = STATE_NORMAL);private Q_SLOTS:void onChecked(bool checked);public:void addWidget(QWidget *widget);State getState() const;private:QVector<QWidget*> children_;State state_;};#endif//EXTENDED_GROUP_BOX_H_#include "ExtendedGroupBox.h"ExtendedGroupBox::ExtendedGroupBox(QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/): QGroupBox(parent){setObjectName("ExtendedGroupBox");setCheckable(true);state_ = state;if (state_ == STATE_NORMAL){//隐藏垂直边框setFlat(true);setChecked(false);}connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool)));}ExtendedGroupBox::ExtendedGroupBox(const QString &title, QWidget *parent /*= nullptr*/, State state /*= STATE_NORMAL*/) : QGroupBox(title, parent){setObjectName("ExtendedGroupBox");setCheckable(true);state_ = state;if (state_ == STATE_NORMAL){//隐藏垂直边框setFlat(true);setChecked(false);}connect(this, SIGNAL(clicked(bool)), this, SLOT(onChecked(bool)));}void ExtendedGroupBox::addWidget(QWidget *widget){if (widget != nullptr){if (state_ == STATE_NORMAL){widget->setVisible(false);}children_.push_back(widget);}}void ExtendedGroupBox::onChecked(bool checked){if (checked){//显⽰垂直边框setFlat(false);for (auto iter = children_.begin(); iter != children_.end(); ++iter){(*iter)->setVisible(true);}state_ = STATE_EXPAND;}else{//隐藏垂直边框setFlat(true);for (auto iter = children_.begin(); iter != children_.end(); ++iter){(*iter)->setVisible(false);}state_ = STATE_NORMAL;}}ExtendedGroupBox::State ExtendedGroupBox::getState() const{return state_;}#include "ExtendedGroupBox.h"#include <QDialog>#include <QVBoxLayout>#include <QHBoxLayout>#include <QFormLayout>#include <QCheckBox>#include <QProgressBar>#include <QFile>#include <QtWidgets/QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);QFile file(":/stylesheets/style.qss");bool s = file.open(QFile::ReadOnly);a.setStyleSheet(file.readAll());file.close();QDialog w;QVBoxLayout *vbox_layout = new QVBoxLayout();//设置窗⼝的layout的SizeConstraint为SetFixedSize,//否则在ExtendedGroupBox收缩时,⽆法动态调整⼤⼩。
如何获得Qt窗口部件在主窗口中的位置
如何获得Qt窗⼝部件在主窗⼝中的位置⽤Qt Creator 设计程序时,最⽅便的就是ui设计器,可以很容易的得到想要的布局。
但是这样⾃动布局带来的后果是很难知道窗⼝中某⼀部件在主窗⼝中的相对位置。
在处理⼦窗⼝⿏标事件时变的很⿇烦。
主窗⼝有菜单、⼯具条等,想⽤⿏标绘图,
把⿏标轨迹映射到窗⼝部件上,这些问题。
其实最主要的是获得窗⼝部件的起始点相对主窗⼝的位置。
例如:在主窗⼝拖⼊⼀个QScrollArea 在其上放⼀个QLabel⽤来显⽰⿏标事件。
可以在ui对象结构上看到如下结构。
⼤家知道,我们可以⽤pos()来获得某⼀窗⼝部件的起始点相对其⽗的位置。
那么,看结构可知,要获得scrollArea_2在主窗⼝(MainWindow)中的相对位置
即为:ui->scrollArea_2->pos()+ui->centralWidget->pos()
所以想获得窗⼝ScrollArea_2在主窗⼝中的相对位置区域为:
labelrect = QRect(ui->scrollArea_2->pos()+ui->centralWidget->pos(),
ui->scrollArea_2->size());
那么判断⿏标是否在此控件上只需在⿏标事件响应函数内写如下语句即可:
if(labelrect.contains(event->pos())) {……}
现在你可以在任意复杂的ui结构中确定某⼀⼦部件的位置了,但⼀定要注意:
⽗关系,即当前部件于其⽗部件的相对位置,其⽗部件与上层部件的相对位置,
直到与主窗⼝的相对位置。
Qt 窗口部件适应窗口大小变化
widget跟随窗口调整
UI界面控件随窗口自适应变化大小
通过Qt Creator的设计模式实现,无需增加代码。
如下图,实现对最下层tableview大小跟随窗口调整:
1、界面空白处右击,选择布局-->栅格布局,这会使centralWidget布局设置为GridLayout。
然后界面中的部件会自动添加到栅格布局中,此时的部件会根据窗口大小自动调整大小。
2、但是部件的大小却不是我们希望的,极不协调,接下来就需要调整每个控件的设置。
调整控件Size的项目包括:sizePolicy、minimumSize、maxmumSize
比如将上面的第三行的lineEdit限制高度:
这样,在调整窗口大小的时候,lineEdit控件只能任意改变宽度,而高度则被限制在30个像素内。
(调整之后效果)
注意:
有些情况下设置了上面的操作步骤之后,但似乎没有起作用。
比如上面例子中第一行的几个空间,虽然设置了sizePolicy以及宽度、高度限制,但是还是随着界面改变。
这个时候,就需要添加 Spacer(看起来像弹簧的控件),之后就能解决问题了。
这是因为GridLayout布局的影响,他必须让布局之内的区域布满控件,而不能有空白,所以即使设置了大小限制,仍然会被拉伸。
添加Spacer就是为了填充多余的区域。
Qt笔记之使用设计器自定义窗口标题栏
Qt笔记之使⽤设计器⾃定义窗⼝标题栏1.在窗⼝显⽰之前,设置WindowFlags为FramelessWindowHint,以产⽣⼀个没有边界的窗⼝例如Widget::Widget(QWidget *parent) :QWidget(parent, Qt::FramelessWindowHint), //在此设置WindowFlagsui(new Ui::Widget){ui->setupUi(this);//setWindowFlags(Qt::FramelessWindowHint); 或在构造函数体中设置}2.在设计器中,拖⼀个Widget到窗⼝上。
为⽅便描述,我命名此Widget为titleBarWidget将titleBarWidget的minimumSize->height改为30,以固定标题栏⾼度更改titleBarWidget的样式表为background-color: #12B7F5;再拖⼀个Vertical Spacer到窗⼝上,并设置窗⼝为竖直布局为去除标题栏边距,将layoutLeftMargin、layoutTopMargin和layoutRightMargin都设置为0效果如图3.为了能拖动标题栏移动窗⼝,我们定义⼀个类,如下TitleBarWidget.h#ifndef TITLEBARWIDGET_H#define TITLEBARWIDGET_H#include <QWidget>class TitleBarWidget : public QWidget{Q_OBJECTpublic:explicit TitleBarWidget(QWidget *parent = nullptr);protected:virtual void mousePressEvent(QMouseEvent *event);virtual void mouseMoveEvent(QMouseEvent *event);private:int differenceX, differenceY;};#endif// TITLEBARWIDGET_HTitleBarWidget.cpp#include "TitleBarWidget.h"#include <QMouseEvent>TitleBarWidget::TitleBarWidget(QWidget *parent) : QWidget(parent) { }void TitleBarWidget::mousePressEvent(QMouseEvent *event){QWidget *parentWidget = static_cast<QWidget *>(parent());differenceX = event->globalX() - parentWidget->x();differenceY = event->globalY() - parentWidget->y();}void TitleBarWidget::mouseMoveEvent(QMouseEvent *event){int x = event->globalX() - differenceX;int y = event->globalY() - differenceY;QWidget *parentWidget = static_cast<QWidget *>(parent());parentWidget->move(x, y);}将titleBarWidget提升为TitleBarWidget,就能实现拖动标题栏移动窗⼝了4.然⽽问题来了,titleBarWidget的样式表失效了为解决这个问题,需要重写QWidget中的paintEvent,代码如下void TitleBarWidget::paintEvent(QPaintEvent *event){Q_UNUSED(event)QStyleOption option;option.init(this);QStylePainter painter(this);painter.drawPrimitive(QStyle::PE_Widget, option);}。
Qt基础教程之自定义对话框及调用方法
在一个应用程序设计中,为了实现一些特定的功能,必领设计自定义对话框。
自定义对话框的设计一般从 QDialog 继承,并且可以采用UI设计器可视化地设计对话框。
对话框的调用一般包括创建对话框、传递数据给对话框、显示对话框获取输入、判断对话框单击按钮的返回类型、获取对话框输入数据等过程。
本节将通过实例 samp6_2 来详细介绍这些原理。
图 1 是实例 samp6_2 的主窗口,及其设置表格行列数的对话框。
图 1 实例 samp6_2 主窗口及其设置表格行列数的对话框主窗口采用 QTableView 和 QStandardltemModel、QltemSelectionModel 构成一个通用的数据表格编辑器,设计了 3 个对话框,分别具有不同的功能,并且展示对话框不同调用方式的特点:•设置表格行列数对话框 QWDialogSize该对话框每次动态创建,以模态方式显示(必须关闭此对话框才可以返回主窗口操作),对话框关闭后获取返回值,用于设置主窗口的表格行数和列数,并且删除对话框对象,释放内存。
这种对话框创建和调用方式适用于比较简单,不需要从主窗口传递大量数据做初始化的对话框,调用后删除对话框对象可以节约内存。
•设置表头标题对话框 QWDialogHeaders图 2 是设置表格表头标题的对话框,该对话框在父窗口(本例中就是主窗口)存续期间只创建一次,创建时传递表格表头字符串列表给对话框,在对话框里编辑表头标题后,主窗口获取编辑之后的表头标题。
图 2 设置表格表头标题对话框注意,对话框以模态方式显示,关闭后只是隐藏,并不删除对象,下次再调用时只是打开己创建的对话框对象。
这种创建和调用方式适用于比较复杂的对话框,需要从父窗口传递大量数据做对话框初始化。
下次调用时不需要重复初始化,能提高对话框调用速度,但是会一直占用内存,直到父窗口删除时,对话框才从内存中删除。
•单元格定位与文字设置对话框QWDialogLocate图 3 是单元格定位和文字设置对话框,该对话框以非模态方式调用,显示对话框时还可以对主窗口进行操作,对话框只是浮动在窗口上方。
Qt编写自定义控件属性设计器
Qt编写⾃定义控件属性设计器以前做.NET开发中,.NET直接就集成了属性设计器,VS不愧是宇宙第⼀IDE,你能够想到的都给你封装好了,⽤起来不要太爽!因为项⽬需要⾃从全⾯转Qt开发已经6年有余,在⼯业控制领域,有⼀些应⽤场景需要⾃定义绘制⼀些控件满⾜特定的需求,⽐如仪器仪表、组态等,⽽且需要直接⽤户通过属性设计的形式⽣成导出控件及界⾯数据,下次导⼊使⽤,要想从内置控件或者⾃定义控件拿到对应的属性⽅法等,⾸先联想到的就是反射,Qt反射对应的类叫QMetaObject,着实强⼤,其实整个Qt开发框架也是超级强⼤的,本⼈⾃从转为Qt开发为主后,就深深的爱上了她,在其他跨平台的GUI开发框架平台⾯前,都会被Qt秒成渣,Qt的跨平台性是⽏庸置疑的,⼏⼗兆的内存存储空间即可运⾏,尤其是嵌⼊式linux这种资源相当紧张的情况下,Qt的性能发挥到极致。
接下来我们就⼀步步利⽤QMetaObject类和QtPropertyBrower(第三⽅开源属性设计器)来实现⾃⼰的控件属性设计器,其中包含了所见即所得的控件属性控制,以及xml数据的导⼊导出。
第⼀步:获取控件的属性名称集合。
所有继承⾃QObject类的类,都有元对象,都可以通过这个QObject类的元对象metaObject()获取属性+事件+⽅法等。
代码如下:QPushButton *btn = new QPushButton;const QMetaObject *metaobject = btn->metaObject();int count = metaobject->propertyCount();for (int i = 0; i < count; ++i) {QMetaProperty metaproperty = metaobject->property(i);const char *name = ();QVariant value = btn->property(name);qDebug() << name << value;}打印输出如下:objectName QVariant(QString, "")modal QVariant(bool, false)windowModality QVariant(int, 0)enabled QVariant(bool, true)geometry QVariant(QRect, QRect(0,0 640x480))frameGeometry QVariant(QRect, QRect(0,0 639x479))normalGeometry QVariant(QRect, QRect(0,0 0x0))省略后⾯很多…可以看到打印了很多⽗类的属性,这些基本上我们不需要的,那怎么办呢,放⼼,Qt肯定帮我们考虑好了,该propertyOffset上场了。
Qt 编写多窗口程序
编写多窗口程序导语程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。
当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。
程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。
在这一篇还会涉及到代码里中文字符串显示的问题。
目录一、添加主窗口二、代码中的中文显示三、添加登录对话框四、使用自定义的对话框类正文一、添加主窗口1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。
2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。
3.现在运行程序,发现中文可以正常显示。
在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。
二、代码中的中文显示1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。
在构造函数MainWindow()中添加代码:MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(new Ui::MainWindow){ui->setupUi(this);ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”}这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。
qt里setlayout用法
Qt里setLayout用法在Qt中,setLayout是一种常用的布局管理器函数,用于设置窗口或窗口部件的布局。
布局管理器是一种用于自动调整窗口部件位置和大小的工具,可以使界面更加灵活和适应不同的窗口尺寸。
本文将详细介绍Qt中setLayout的用法,包括创建布局管理器、设置布局管理器、添加和删除窗口部件等操作。
1. 创建布局管理器在使用setLayout之前,我们首先需要创建一个布局管理器。
Qt提供了几种常用的布局管理器,包括垂直布局(QVBoxLayout)、水平布局(QHBoxLayout)、网格布局(QGridLayout)等。
1.1 垂直布局(QVBoxLayout)垂直布局将窗口部件按照垂直方向依次排列,可以使用QVBoxLayout类来创建垂直布局管理器。
QVBoxLayout *layout = new QVBoxLayout();1.2 水平布局(QHBoxLayout)水平布局将窗口部件按照水平方向依次排列,可以使用QHBoxLayout类来创建水平布局管理器。
QHBoxLayout *layout = new QHBoxLayout();1.3 网格布局(QGridLayout)网格布局将窗口部件按照网格形式排列,可以使用QGridLayout类来创建网格布局管理器。
QGridLayout *layout = new QGridLayout();1.4 其他布局管理器除了上述常用的布局管理器,Qt还提供了一些其他的布局管理器,如堆叠布局(QStackedLayout)、表单布局(QFormLayout)等,根据实际需求选择合适的布局管理器。
2. 设置布局管理器创建布局管理器后,我们需要将其设置给窗口或窗口部件,以便布局管理器能够对窗口部件进行布局。
QWidget *widget = new QWidget();widget->setLayout(layout);在上述代码中,我们创建了一个QWidget对象widget,并通过setLayout函数将布局管理器layout设置给widget。
QT(4).窗口、对话框、状态栏、菜单栏
QT(4).窗⼝、对话框、状态栏、菜单栏1、坐标体系以左上⾓为原点,X向右增加,Y向下增加。
对于嵌套窗⼝,其坐标是相对于⽗窗⼝来说的。
2、QWidget所有窗⼝及窗⼝控件都是从QWidget直接或间接派⽣出来的。
3、QMainWindowQMainWindow是⼀个为⽤户提供主窗⼝程序的类,包含⼀个菜单栏(menubar)、多个⼯具栏(tool bars)、多个锚接部件(dock widgets)、⼀个状态栏(status bar)及⼀个中⼼部件(central widget),是许多应⽤程序的基础,如⽂本编辑器,图⽚编辑器等。
1、菜单栏⼀个主窗⼝最多只有⼀个菜单栏。
位于主窗⼝顶部、主窗⼝标题栏下⾯。
创建菜单栏,通过QMainWindow类的menubar()函数获取主窗⼝菜单栏指针QMenuBar *menuBar() const创建菜单,调⽤QMenu的成员函数addMenu来添加菜单QAction*addMenu(QMenu * menu)QMenu*addMenu(const QString & title)QMenu*addMenu(const QIcon & icon, const QString & title)创建菜单项,调⽤QMenu的成员函数addAction来添加菜单项QAction*activeAction() constQAction*addAction(const QString & text)QAction*addAction(const QIcon & icon, const QString & text)QAction*addAction(const QString & text, const QObject * receiver,const char * member, const QKeySequence & shortcut = 0)QAction*addAction(const QIcon & icon, const QString & text,const QObject * receiver, const char * member,const QKeySequence & shortcut = 0)Q t 并没有专门的菜单项类,只是使⽤⼀个QAction类,抽象出公共的动作。
Qt自定义插件编程小结
Qt⾃定义插件编程⼩结⾃定义组件开发步骤演⽰。
以下所有步骤的前提是⾃⼰先编译Qtcreator源码,最好⽣成release版的QtCreator,否则⾃定义的插件qt⾃定义组件开发步骤演⽰(这个⽹上教程很多)嵌⼊QtCreator会失败会失败(这个⽹上教程很多)Step1:新建⼯程,选择其他项⽬->Qt4设计师⾃定义控件Step2:填写⼯程名,然后⼀路点击下⼀步,直⾄Step3Step3:填写控件类名,点击下⼀步Step4:若装了版本控制Git⼯具的话,最好选上,以便后期修改,点击完成即可成功创建⼯程Step5:利⽤控件提升法。
Ø 删除上图黄⾊矩形框中的HelloWorld类的两个⽂件(helloworld.h和helloworld.cpp)Ø 再重新给⼯程添加⼀个同名的HelloWorld类,基类选择QWidget类,如下图所⽰点击下⼀步⽣成新的⼯程,如下图所⽰Ø 接着修改helloworldplugin.h⾥的头⽂件根据Qt相应版本修改,我这⾥的版本是Qt5.6.1 MinGW,所以修改成如上图所⽰的红⾊矩形中的头⽂件Ø 再接着在helloworld.h的头⽂件⾥添加头⽂件#include <QtUiPlugin/QDesignerExportWidget>Ø 最后在helloworld.h头⽂件⾥的类名前加上宏QDESIGNER_WIDGET_EXPORT如下图所⽰:Step6:此时你就可以根据需求开发你想要的⾃定义插件了,这⾥之所以利⽤提升法来做最主要的是可以利⽤QtCreator的原⽣控件来辅助⾃定义插件开发,提⾼⽣产⼒。
举⼀个简单的例⼦来说明⾃定义插件的使⽤,如下图⽰:拖⼀个pushbutton,定制⼀个字幕为Hello Qt的按钮插件,然后选择release模式运⾏⼯程,会⽣成库⽂件helloworldplugin.dll和libhelloworldplugin.a。
Qt设置窗口属性setWindowFlags函数
Qt设置窗⼝属性setWindowFlags函数说明:setWindowFlags函数就是设置窗⼝属性,本博客主要分析此函数的参数主要是记录⼀下项⽬中遇到的问题。
主要使⽤的是WindowsType枚举enum WindowType {Widget = 0x00000000,Window = 0x00000001,Dialog = 0x00000002 | Window,Sheet = 0x00000004 | Window,Drawer = 0x00000006 | Window,Popup = 0x00000008 | Window,Tool = 0x0000000a | Window,ToolTip = 0x0000000c | Window,SplashScreen = 0x0000000e | Window,Desktop = 0x00000010 | Window,SubWindow = 0x00000012,WindowType_Mask = 0x000000ff,MSWindowsFixedSizeDialogHint = 0x00000100,MSWindowsOwnDC = 0x00000200,X11BypassWindowManagerHint = 0x00000400,FramelessWindowHint = 0x00000800,WindowTitleHint = 0x00001000,WindowSystemMenuHint = 0x00002000,WindowMinimizeButtonHint = 0x00004000,WindowMaximizeButtonHint = 0x00008000,WindowMinMaxButtonsHint = WindowMinimizeButtonHint | WindowMaximizeButtonHint,WindowContextHelpButtonHint = 0x00010000,WindowShadeButtonHint = 0x00020000,WindowStaysOnTopHint = 0x00040000,// reserved for Qt3Support:// WMouseNoMask = 0x00080000,// WDestructiveClose = 0x00100000,// WStaticContents = 0x00200000,// WGroupLeader = 0x00400000,// WShowModal = 0x00800000,// WNoMousePropagation = 0x01000000,CustomizeWindowHint = 0x02000000,WindowStaysOnBottomHint = 0x04000000,WindowCloseButtonHint = 0x08000000,MacWindowToolBarButtonHint = 0x10000000,BypassGraphicsProxyWidget = 0x20000000,WindowOkButtonHint = 0x00080000,WindowCancelButtonHint = 0x00100000,WindowSoftkeysVisibleHint = 0x40000000,WindowSoftkeysRespondHint = 0x80000000}Qt::Widget: QWidget构造函数的默认值,如果新的窗⼝部件没有⽗窗⼝部件,则它是⼀个独⽴的窗⼝,否则就是⼀个⼦窗⼝部件Qt::Window: ⽆论是否有⽗窗⼝部件,新窗⼝部件都是⼀个窗⼝,通常有⼀个窗⼝边框和⼀个标题栏Qt::Dialog: 新窗⼝部件是⼀个对话框,它是QDialog构造函数的默认值Qt::Sheet:新窗⼝部件是⼀个Macintosh表单(sheet)Qt::Drawer: 新窗⼝部件是⼀个Macintosh抽屉(drawer)Qt::Popup: 新窗⼝部件是⼀个弹出式顶层窗⼝Qt::Tool: 新窗⼝部件是⼀个⼯具(tool)窗⼝,它通常是⼀个⽤于显⽰⼯具按钮的⼩窗⼝。
Qt窗口的一些简单设置-标题、图标、最大化最小化按钮、任务栏图标
Qt窗⼝的⼀些简单设置-标题、图标、最⼤化最⼩化按钮、任务栏图标零零碎碎看了很多Qt例⼦,有⼀些很零散的窗体控制⽅法,在这总结⼀些。
1.更改窗体标题this->setWindowTitle("窗体标题");窗体标题”就是更改的窗体标题2.控制窗体⼤⼩1this->setMaximumSize(300,300); //窗体最⼤尺⼨2this->setMinimumSize(300,300); //窗体最⼩尺⼨3this->setMinimumHeight(300); //单独设置窗体⾼的最⼩值4this->setMaximumWidth(300); //单独设置窗体宽的最⼩值也可以通过窗体布局控制窗体⼤⼩1 QGridLayout *mainLayout = new QGridLayout; //窗体中控件为⽹格布局2 mainLayout->setSizeConstraint(QLayout::SetFixedSize); //布局⼤⼩不变在构造函数中的这个函数强制设置窗体的布局为固定⼤⼩,⽤户不可⾃⾏调整对话框⼤⼩。
布局管理器将会负责调整⼤⼩的任务,当⼀些⼦窗⼝期间显⽰或隐藏的时候⾃动的调整对话框的⼤⼩,以保证对话框总是以优化了的⼤⼩显⽰。
在官⽅⽂档中setSizeConstraint给的解释为:sizeConstraint:SizeConstraint. This property holds the resize mode of the layout.这个函数主要是通过布局管理器对布局⼤⼩进⾏限制,与上⾯介绍的窗体⼤⼩有所不同。
函数SetFixedSize如下:void QWidget::setFixedSize(const QSize &s);设置控件的最⼤和最⼩尺⼨为s,防⽌控件⼤⼩的变化。
3.更改窗体图标⾸先在项⽬右键-->添加新⽂件,弹出如下对话框在左侧选中Qt,右侧选择Qt Resource File,然后Choose,页⾯如下:如果路径没错的话就⾃⼰命⼀个名字例如:icon,然后下⼀步,⼀路next知道完成。
qt自定义窗口的标题栏
因为标题栏属于窗口管理器控制,也就受限于操作系统,所以直接利用Qt来修改是不可行的! 通常情况下利用Qt我们可以自定义标题栏,这里提供一个简单的例子!例子比较简,大致思路是正常创建窗口后,屏蔽标题栏,通过布局将一个QLabel和三个按钮构成一个“标题栏”放置在顶端(视个人喜好,位置可以任意放置),重新实现必要的事件。
下面分步骤进行:1. 创建窗口,屏蔽标题栏例子中是创建了一个MainWindow窗口,构造过程中传入Qt::FramelessWindowHint 参数.customTitleBar::customTitleBar(QWidget*parent, Qt::WFlags flags) : QMainWindow(parent, Qt::FramelessWindowHint){ui.setupUi(this);ui.menuBar->hide(); ui.statusBar->hide();......}2. 将自定义的“标题栏”放入窗口中这里我们直接用QDeisgner进行设计,设计完成后利用布局将其置于顶端即可.3. 事件处理在这里我们只是简单实现鼠标操作窗口的放大、缩小和移动,所以只重写鼠标事件: 单击、释放、双击和移动。
view plaincopy to clipboardprint?1./*2. QRect rect = ui.titleFrame->frameRect();3. if(rect.contains(event->pos()));4.这两句就是用于判断鼠标位置是否落在“标题栏”内。
5.*/6.void Qt_Test::mousePressEvent(QMouseEvent *event)7.{8. if(event->button() == Qt::LeftButton)9. {10. dragPosition = event->globalPos() - frameGeometry().topLeft();11.12. QRect rect = ui.titleFrame->frameRect();13. if(rect.contains(event->pos()))14. {15. m_bMoveable = true;16. }17. event->accept();18. }19.}20.21.void Qt_Test::mouseMoveEvent(QMouseEvent *event)22.{23. if(event->buttons() & Qt::LeftButton && !m_bMaximized && m_bMoveable)24. {25. move(event->globalPos() - dragPosition);26. event->accept();27. }28.}29.30.void Qt_Test::mouseReleaseEvent(QMouseEvent* event)31.{32. if(m_bMoveable)33. {34. m_bMoveable = false;35. }36.}37.38.// 鼠标双击事件直接调用了还原按钮的事件39.void Qt_Test::mouseDoubleClickEvent(QMouseEvent* event)40.{41. QRect rect = ui.titleFrame->frameRect();42. if(rect.contains(event->pos()))43. {44. on_restoresize_clicked();45. }46.}47./*48.此例子是在Windows下编写,所以直接调用了Win32 API;49.且只是假设任务栏在底端 :)50.*/51.void Qt_Test::on_restoresize_clicked()52.{53. if(m_bMaximized)54. {55. setGeometry(m_preRect);56. m_bMaximized = false;57. }58. else59. {60. m_preRect = geometry();61. WINDOWINFO wf;62. ::GetWindowInfo(FindWindow(L"Shell_TrayWnd", NULL), &wf);63. RECT trayRect = wf.rcWindow;64. setGeometry(0, 0, trayRect.right+1, trayRect.top+1);65. m_bMaximized = true;66. }67.}。
Qt子窗口(自定义qdialog,qwidget)嵌入到父窗口,子窗口跟随父窗口
Qt⼦窗⼝(⾃定义qdialog,qwidget)嵌⼊到⽗窗⼝,⼦窗⼝跟随⽗窗⼝当我们⾃⼰定义了⼀个类继承⾃QWdiget,并在其中实现了⼀些⾃定义的功能(⽐如QLabel移动到指定坐标)例如class Demonstration_Widget : public QWidget想要把这个窗⼝嵌⼊到主窗⼝中,与其他窗⼝⼀起在主窗⼝中构成主界⾯只需要在这个⼦窗⼝的构造函数中添加:1 setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);2 hide();⽽在主GUI窗⼝的类中添加⼦窗⼝的头⽂件,例如:1 #include <QMainWindow>2 #include "demonstration_widget.h"34namespace Ui {5class MainWindow;6 }78class MainWindow : public QMainWindow9 {10 Q_OBJECT1112public:13explicit MainWindow(QWidget *parent = 0);14 ~MainWindow();1516private:17 Ui::MainWindow *ui;1819 Demonstration_Widget *w_demonstration;20 };接着在主界⾯对应类的构造函数中,创建⼦窗⼝对象,设置⼦窗⼝显⽰位置并使其显⽰即可。
例如:1 MainWindow::MainWindow(QWidget *parent) :2 QMainWindow(parent),3 ui(new Ui::MainWindow)4 {5 ui->setupUi(this);6 w_demonstration = new Demonstration_Widget(this);7 w_demonstration->move(250,250);8 w_demonstration->show();910 }最后中main.cpp中显⽰主界⾯,可以看到⼦窗⼝嵌⼊到了主界⾯的相应位置1 #include <QApplication>2 #include "mainwindow.h"34int main(int argc, char *argv[])5 {6 QApplication a(argc, argv);78 MainWindow mainw;9 mainw.show();1011return a.exec();12 }。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【原创】Qt自定义窗口部件QtDesigner自定义窗口部件有两种方法:改进法(promotion)和插件法(plugin)改进法1、改进法之前,要先写好子类化QSpinBox后的HexspinBox.h和HexspinBox.cpp文件。
把这两个文件拷贝到想要的项目中。
HexspinBox.hHexspinBox.cpp2、在需要开发的项目中的窗口中,1、用Qt Designer创建一个新的窗体main.ui,把控件箱里的QSpinBox添加到窗体中。
2、右击微调框,选择“Promote to ”上下文菜单。
3、在弹出的对话框中,类名处填写“HexSpinBox”,头文件填写“hexspinbox.h”好了。
在ui生成的包含有QSpinBox的控件文件中,ui的源代码里面多了一段<customwidgets><customwidget><class>HSpinBox</class><extends>QSpinBox</extends><header>hspinbox.h</header></customwidget>包含文件变为"hexspinbox.h"。
在Qt Designer中,QSpinBox表示的控件为HexSpinBox,并且可以设置所有的QSpinBox的属性。
可以在VS2008中编译一下main.ui文件,从ui_main.h源代码中可以知道,引入的控件是:升级法的缺点是不能在Qt Designer中设置自定义控件自己的特有属性,也不能够绘制自己。
这些问题可以用插件法解决。
插件法1.VS中创建Qt4 Design Plugin 工程,名称叫custom自动建立如下几个文件:自定义控件:custom.h,custom.cpp插件:customplugin.h,customplugin.cpp源代码如下:custom.hcustom.cppcustomplugin.hcustomplugin.cpp在其cpp的最后必须添加下面的宏:.........10........20........30........40........50........60........70........80........90........100. (1)10.......120.......130.......140. (150)2. 新建后,直接编译,会产生如下错误1>LINK : fatal error LNK1181: cannot open input file 'QtDesignerd.lib'这是因为此工程默认引用的是QtDesignerd.lib库,更改其为版本对应的库即可消除故障(VS2008是在项目的属性中Linker/input/Additional Dependencies中修改,我这里Debug配置使用的是QtDesignerd4.lib,Release 版本使用QtDesigner4.lib)。
3、使用自定义插件1)、只需要把通过Release模式生成的项目.lib和项目.dll文件拷到C:\Qt\4.7.4\plugins\designer中,2)、然后在QtDesigner中,选择菜单Help/About Plugin就可以看到你的自定义控件是否已经载入成功。
在QtDesigner中控件列表中有一项My Widget 中就有你的自定义控件。
参考:1、 Qt自定义控件(插件)并添加到QtDesigher打开QtDesigner,我们自定义的空间custom成功使用界面如下:之前使用Qt的时候都是手写代码的(因为批量按钮可以使用数组实现),但当界面越来越复杂时,这种开发效率就太低了;后来就开始使用QtDesigner,但要使QtDesigner支持我自己写的控件,需要提升或插件的形式(在<C++ GUI Qt 4编程(第二版)>中有介绍).结果看了之后,觉得提升的方式简单而不灵活,故使用插件法实现;步骤如下:[具体可参照第三方开源组件Qwt部件库的插件类的实现方式,个人感觉特别规范]1. 继承QObject和QDesignerCustomWidgetInterface实现插件类(或继承QObject和QDesignerCustomWidgetCollectionInterface实现多个自定义控件);2. 编写Qt平台无关的工程文件.pro(例如CustomWidgetPlugin.pro);3. qmake CustomWidgetPlugin.pro;4. make(windows下vc平台使用nmake,如果发现缺少环境变量,可以运行其bin/vcvars32.bat配置环境)先说说第一点:继承后需要重写父类虚函数,原型如下:[cpp]view plaincopy在其cpp的最后必须添加下面的宏:[cpp]view plaincopy再说说第二点:.pro的参数和语法比较多, 在网上可以搜到不少资料, 在这里总结一下1. 注释从“#”开始,到这一行结束。
2. 指定源文件SOURCES = *.cpp对于多源文件,可用空格分开,如:SOURCES = 1.cpp 2.cpp3.cpp或者每一个文件可以被列在一个分开的行里面,通过反斜线另起一行,就像这样:SOURCES = hello.cpp /(续行符)main.cpp一个更冗长的方法是单独地列出每一个文件,就像这样:SOURCES+= hello.cppSOURCES +=main.cpp这种方法中使用“+=”比“=”更安全,因为它只是向已有的列表中添加新的文件,而不是替换整个列表。
3. 指定头文件HEADERS = hello.h或者HEADERS += hello.h列出源文件的任何一个方法对头文件也都适用。
4. 配置信息CONFIG用来告诉qmake关于应用程序的配置信息。
CONFIG+= qt warn_on release编译QtDesigner插件中使用CONFIG += desginer plugin release在这里使用“+=”,是因为我们添加我们的配置选项到任何一个已经存在中。
这样做比使用“=”那样替换已经指定的所有选项是更安全的。
A> qt部分告诉qmake这个应用程序是使用Qt来连编的。
这也就是说qmake在连接和为编译添加所需的包含路径的时候会考虑到Qt库的。
B> warn_on部分告诉qmake要把编译器设置为输出警告信息的。
C> release部分告诉qmake应用程序必须被连编为一个发布的应用程序。
在开发过程中,程序员也可以使用debug来替换release5. 指定目标文件名TARGET = filename如果不设置该项目,目标名会被自动设置为跟项目文件一样的名称6. 添加界面文件(ui )INTERFACES = filename.ui7. 平台相关性处理我们在这里需要做的是根据qmake所运行的平台来使用相应的作用域来进行处理。
为Windows平台添加的依赖平台的文件的简单的作用域看起来就像这样:win32 {SOURCES += hello_win.cpp}所以如果qmake运行在Windows上的时候,它就会把hello_win.cpp添加到源文件列表中。
如果qmake运行在其它平台上的时候,它会很简单地把这部分忽略。
8. 如果一个文件不存在,停止qmake如果某一个文件不存在的时候,你也许不想生成一个Makefile。
我们可以通过使用exists()函数来检查一个文件是否存在。
我们可以通过使用error()函数把正在运行的qmake停下来。
这和作用域的工作方式一样。
只要很简单地用这个函数来替换作用域条件。
对main.cpp文件的检查就像这样:!exists( main.cpp ) {error( "No main.cpp file found")}“!”用来否定这个测试,比如,如果文件存在,exists( main.cpp)是真,如果文件不存在,!exists( main.cpp )是真。
9. 检查多于一个的条件假设你使用Windows并且当你在命令行运行你的应用程序的时候你想能够看到qDebug()语句。
除非你在连编你的程序的时候使用console设置,你不会看到输出。
我们可以很容易地把console添加到CONFIG行中,这样在Windows下,Makefile就会有这个设置。
但是如果告诉你我们只是想在当我们的应用程序运行在Windows下并且当debug已经在CONFIG行中的时候,添加console。
这需要两个嵌套的作用域;只要生成一个作用域,然后在它里面再生成另一个。
把设置放在最里面的作用域里,就像这样:win32 {debug {CONFIG += console}}嵌套的作用域可以使用冒号连接起来,像这样:win32:debug {CONFIG += console}10. 摸板模板变量告诉qmake为这个应用程序生成哪种makefile。
下面是可供使用的选择:A> app -建立一个应用程序的makefile。
这是默认值,所以如果模板没有被指定,这个将被使用。
B> lib - 建立一个库的makefile。
C> vcapp - 建立一个应用程序的VisualStudio项目文件。
D> vclib - 建立一个库的VisualStudio项目文件。
E> subdirs -这是一个特殊的模板,它可以创建一个能够进入特定目录并且为一个项目文件生成makefile并且为它调用make的makefile。
如果需要编译成windows的dll库,可以在CONFIG中添加一个配置"CONFIG += dll"实现11. 生成Makefile当你已经创建好你的项目文件,生成Makefile就很容易了,你所要做的就是先到你所生成的项目文件那里然后输入:Makefile可以像这样由“.pro”文件生成:qmake -oMakefile hello.pro对于VisualStudio的用户,qmake也可以生成“.dsp”文件,例如:qmake -tvcapp -o hello.dsp hello.pro。