QT MainWindow和Dialog的区别和选择

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT MainWindow和Dialog的区别和选择相关的知识,希望对你有一定的参考价值。

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(););
参考技术A 两个都是继承QWidget, 但两者区别挺大的!
QMainWindow是一个程序主窗口, 它和QWidget的区别就是自带状态栏和菜单栏;
QDialog是一个弹出框, QDialog::exec是可以阻塞程序, 但是事件循环还是会继续, 也就是程序会等待exec函数返回, 但是界面的一个信号槽还是可以运行;
参考技术B QMainWindow可以添加菜单栏 工具栏 状态栏等,QDialog不行

Qt 链接问题

【中文标题】Qt 链接问题【英文标题】:Qt linking problems 【发布时间】:2014-01-08 21:58:01 【问题描述】:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "dialog.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)

    ui->setupUi(this);
   setCentralWidget(ui->plainTextEdit);


MainWindow::~MainWindow()

    delete ui;


void MainWindow::on_actionDoit_triggered()

    Dialog D;
    D.setModal(true);
    D.exec();

这段代码给了我链接器错误 LNK2019 和 LNK1120 如果我删除函数 void MainWindow::on_actionDoit_triggered() 中的三行,它可以工作。我正在关注的教程没有警告链接器问题

【问题讨论】:

如果代码编译正确并且我有链接器错误,我删除构建文件夹并重建,它似乎编译和链接正常,但不知道为什么 你在做什么来编译程序?纯编译、Qt CreatorQMake编辑:你能给出教程的链接吗? 好吧,我正在使用 MSVC 编译器,并且我正在使用构建按钮 (ctrl + B) 构建它 链接错误的完整文本到底是什么? imgur.com/hlAtzwG 【参考方案1】:

显然,您只需明确地重新运行 qmake 就可以在不更改代码的情况下运行它。

原因很可能是您修改了 qmake 项目文件,而 QtCreator 在知道何时正确重新运行 qmake 方面存在问题。

有一个长期存在的错误:

Creator should know when to rerun qmake

【讨论】:

以上是关于QT MainWindow和Dialog的区别和选择的主要内容,如果未能解决你的问题,请参考以下文章

qt 两个界面 参数传递

qt 两个界面 参数传递

Qt 链接问题

QT Creator中[main]和[mainwindow]的区别

QT中如何实现界面之间传递数据??

Qt中QObject中的parent参数