C++ GUI Programming with Qt4 笔记 -- chap2 QDialog

以 finddialog 为例,介绍 QDialog。并对 Qt 的基本概念和技巧做了更进一步(chap1)的介绍。

1.MOC 扩展与signals–slots 机制

严格来说,Qt 开发,写的并不是标准 C++。

Meta-Object System 是 Qt 对 C++ 的一项重要扩展,简称 moc。

moc  is a mechanism for creating independent software components

that can be bound together without any component knowing anything about the
other components it is connected to

提供了 2 个关键内容:signals–slots and introspection。

其中,introspection 是实现 signals–slots 的基础。

The mechanism works as follows:

  • The Q_OBJECT macro declares some
    introspection functions that must be implemented in every QObject
    subclass: metaObject(), tr(), qt_metacall(), and a
    few more.

  • Qt‘s moc tool generates implementations for the
    functions declared by Q_OBJECT and for all the signals.

  • QObject member functions such as
    connect() and disconnect() use the introspection functions
    to do their work.

All of this is handled automatically by qmake,
moc, and QObject, so you rarely need to think about it.

But if you are curious, you can read the
QMetaObject class documentation

and have a look at the C++ source files generated by
moc to see how the implementation works.

2. 技巧与细节


2.1 class forward declaration

在头文件中,如果只用到了某个类的指针,不依赖于类的定义与实现。

可以使用  class
ClassName 声明类,取代  #include
"ClassName.h"

相比于加载头文件,前置声明更简洁,性能更好。

2.2 国际化:用户可见的文字,使用  tr()


2.3 快捷键:使用 & 声明快捷键。

例如  &Find 声明快捷键为
F,

setBuddy(widget)  设置快捷键按下时,focus 到
widget 组件上,而非自身。

2.4  setDefault  按下 Enter 键时的行为。


2.5 setLayout 时会重新计算父子关系。

layout 中的所有组件,都变成 setLayout 对象的子对象。

2.6 使用 moc 机制(Q_OBJECT)时,类的定义必须在 .h 文件中,否则 moc 不会正常工作。


// finddialog.h
#ifndef FINDDIALOG_H
#define FINDDIALOG_H

#include <QDialog>

class QCheckBox;
class QLabel;
class QLineEdit;
class QPushButton;

class FindDialog : public QDialog
{
Q_OBJECT
public:
FindDialog(QWidget *parent = 0);
signals:
void findNext(const QString &str, Qt::CaseSensitivity cs);
void findPrevious(const QString &str, Qt::CaseSensitivity cs);
private slots:
void findClicked();
void enableFindButton(const QString &text);
private:
QLabel *label;
QLineEdit *lineEdit;
QCheckBox *caseCheckBox;
QCheckBox *backwardCheckBox;
QPushButton *findButton;
QPushButton *closeButton;
};

#endif


// finddialog.cpp
#include <QtGui>
#include "finddialog.h"

FindDialog::FindDialog(QWidget *parent)
: QDialog(parent)
{
// widgets
label = new QLabel(tr("Find &what: "));
lineEdit = new QLineEdit;
label->setBuddy(lineEdit);

caseCheckBox = new QCheckBox(tr("Match &case"));
backwardCheckBox = new QCheckBox(tr("Search &backward"));

findButton = new QPushButton(tr("&Find"));
findButton->setDefault(true);
findButton->setEnabled(false);
closeButton = new QPushButton(tr("Close"));

// connections
connect(lineEdit, SIGNAL(textChanged(const QString &)),
this, SLOT(enableFindButton(const QString &)));
connect(findButton, SIGNAL(clicked()),
this, SLOT(findClicked()));
connect(closeButton, SIGNAL(clicked()),
this, SLOT(close()));

// layout
QHBoxLayout *topLeftLayout = new QHBoxLayout;
topLeftLayout->addWidget(label);
topLeftLayout->addWidget(lineEdit);

QVBoxLayout *leftLayout = new QVBoxLayout;
leftLayout->addLayout(topLeftLayout);
leftLayout->addWidget(caseCheckBox);
leftLayout->addWidget(backwardCheckBox);

QVBoxLayout *rightLayout = new QVBoxLayout;
rightLayout->addWidget(findButton);
rightLayout->addWidget(closeButton);
rightLayout->addStretch();

QHBoxLayout *mainLayout = new QHBoxLayout;
mainLayout->addLayout(leftLayout);
mainLayout->addLayout(rightLayout);

setLayout(mainLayout);
setWindowTitle(tr("Find"));
setFixedHeight(sizeHint().height());
}

void FindDialog::findClicked()
{
QString text = lineEdit->text();
Qt::CaseSensitivity cs =
caseCheckBox->isChecked() ? Qt::CaseSensitive
: Qt::CaseInsensitive;
if (backwardCheckBox->isChecked()) {
emit findPrevious(text, cs);
} else {
emit findNext(text, cs);
}
}

void FindDialog::enableFindButton(const QString &text)
{
findButton->setEnabled(!text.isEmpty());
}


// main.cpp
#include <QApplication>
#include "finddialog.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FindDialog *dialog = new FindDialog;
dialog->show();
return app.exec();
}

C++ GUI Programming with Qt4 笔记 -- chap2 QDialog

时间: 2024-10-01 07:50:17

C++ GUI Programming with Qt4 笔记 -- chap2 QDialog的相关文章

JAVA之GUI编程概述学习笔记(22)

      下列内容为本人看毕向东老师java视频教程学习笔记! JAVA GUI图形用户界面编程: Windows 操作系统提供两种操作方式:                                 1.GUI                2.CLI; GUI:Grahi User Interface ,图形用户界面.                       特点:用图形的方式,来显示计算机操作的界面,这样更方便更直观. CLI: Command line User Interf

Python GUI programming(tkinter)

python3之前的版本用Tkinter,之后用的是tkinter 最简单的使用Tkinter的代码,首先要Tk()建立一个窗口,然后加进各种Widget from Tkinter import * window = Tk() label = Label(window, text = "Welcome to Python") button = Button(window, text = "Click me") label.pack() button.pack() w

九章算法系列(#3 Dynamic Programming)-课堂笔记

前言 时隔这么久才发了这篇早在三周前就应该发出来的课堂笔记,由于懒癌犯了,加上各种原因,实在是应该反思.好多课堂上老师说的重要的东西可能细节上有一些急记不住了,但是幸好做了一些笔记,还能够让自己回想起来.动态规划算是我的一道大坎了,本科的时候就基本没有学过,研一的时候老师上课也是吃力的跟上了老师的步伐,其实那个时候老师总结的还是挺好的:把动态规划的题目都分成了一维动规.二维遍历.二维不遍历等一系列的问题.这次听了老师的课程,觉得还是需要更加集中的去把各种题进行一个分类吧,然后有针对的去准备,虽然

C++ Programming language读书笔记

http://blog.163.com/leonary_dy/blog/static/405528602009122103416862/ 虽然很多人一再强调语言细节不重要,可我还是要花时间重读经典.上次我认认真真读这本书还要追溯到两年前,现在我对C++的理解更深了一层,可以从书中读到一些两年前无法领悟的东西. 声明:本笔记只记录我以前不了解的部分,请初学者不要作为书籍摘要 我看的是TCPL电子版第三版,June 1997第一次印刷.这是网上最常见的版本,前两页书皮虽然写着special版,其实后

Go Programming Blueprints 读书笔记(谈到了nsq/mgo处理数据持久化,但是业务逻辑不够复杂)

Go Programming Blueprints http.Handle("/", &templateHandler{filename: "chat.html"}); http.Handle静态方法? 带参数的函数对象参数? 就是个普通的struct--为何不需要new? go get github.com/gorilla/websocket(方便的包依赖管理!) Go语句不需要:标记结束 TDD: 在没有定义type struct之前假设已经存在? 控制

Python:GUI之tkinter学习笔记1控件的介绍及使用

相关内容: tkinter的使用 1.模块的导入 2.使用 3.控件介绍 Tk Button Label Frame Toplevel Menu Menubutton Canvas Entry Message Text Listbox Checkbutton Radiobutton Scale Scrollbar 首发时间:2018-03-04 16:39 Python的GUI各有各特点. 由于只是轻微涉及GUI开发,所以就以轻量级的tkinter来学习. tkinter的使用: 1.模块的导入

PyQt5 GUI Programming With Python 3.6 (一)

PyQt5 PyQt5是一个基于强大的图形程式框架Qt5的python接口, 主要包含以下几个大类: ● QtCore ● QtGui ● QtWidgets ● QtMultimedia ● QtBluetooth ● QtNetwork ● QtPositioning ● Enginio ● QtWebSockets ● QtWebKit ● QtWebKitWidgets ● QtXml ● QtSvg ● QtSql ● QtTest QtCore模块涵盖了包的核心的非GUI功能,此模块

The C++ Programming Language 学习笔记 第5章 指针、数组和结构

1.关于输出指向字符的指针的值. 现在定义,char c='a',char* pc=&c.在C中,输出该值只需要printf("%p\n",pc);而在C++中,如果cout<<pc<<endl;则会出现奇怪的一串字符,怎么回事呢.由于C++标准库中I/)类对<<操作符重载,因此在遇到字符型指针时会将其当作字符串名来处理,输出指针所指的字符串.所以我们可以将其先转化为void*,再输出. cout << static_cast&l

[Introduction to programming in Java 笔记] 1.3.7 Converting to binary 十进制到二进制的转换

public class Binary { public static void main(String[] args) { // Print binary representation of N. int N = Integer.parseInt(args[0]); int v = 1; while(v <= N/2) v = 2*v; // Now v is the largest power of 2 <= N. int n = N; // current excess while (v