1. 从UI生成.h的过程
用最新的QtCreator选择GUI的应用会产生含有如下文件的工程。
如下是一个简单的主窗体来包含这个ui文件
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
namespace Ui
{
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui; // 重点是这个,主窗体包含这个UI控件
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this); // 内部那个ui控件
}
MainWindow::~MainWindow()
{
delete ui;
}
自动生成的ui_mainwindow.h其实包含了很多内容:
#ifndef UI_MAINWINDOW_H
#define UI_MAINWINDOW_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QHeaderView>
#include <QtGui/QMainWindow>
#include <QtGui/QMenuBar>
#include <QtGui/QStatusBar>
#include <QtGui/QToolBar>
#include <QtGui/QWidget>
QT_BEGIN_NAMESPACE
class Ui_MainWindow
{
public:
QMenuBar *menuBar;
QToolBar *mainToolBar;
QWidget *centralWidget;
QStatusBar *statusBar;
void setupUi(QMainWindow *MainWindow)
{
if (MainWindow->objectName().isEmpty())
MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
MainWindow->resize(600, 400);
menuBar = new QMenuBar(MainWindow);
menuBar->setObjectName(QString::fromUtf8("menuBar"));
MainWindow->setMenuBar(menuBar);
mainToolBar = new QToolBar(MainWindow);
mainToolBar->setObjectName(QString::fromUtf8("mainToolBar"));
MainWindow->addToolBar(mainToolBar);
centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
MainWindow->setCentralWidget(centralWidget);
statusBar = new QStatusBar(MainWindow);
statusBar->setObjectName(QString::fromUtf8("statusBar"));
MainWindow->setStatusBar(statusBar);
retranslateUi(MainWindow);
QMetaObject::connectSlotsByName(MainWindow); // 注意这个函数,由控件名默认生成信号!!!
} // setupUi
// 翻译文本
void retranslateUi(QMainWindow *MainWindow)
{
MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow", 0, QApplication::UnicodeUTF8));
Q_UNUSED(MainWindow);
} // retranslateUi
};
namespace Ui
{
class MainWindow: public Ui_MainWindow {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_MAINWINDOW_H
2.? ?QMetaObject::connectSlotsByName(MainWindow)
经过编写测试代码,发现这句话的功能是,自动把 MainWindow里对象的signal和slot 按照on_objectname_signal()的规则进行自动连接。
详细的自动连接过程是这样的:如果在MainWindow类中定义了一个名为on_pushButton_clicked()的槽,则connectSlotsByName 会自动去为它匹配一个ui里名为pushButton对象的clicked()信号,
?注意:connectSlotsByName 只会为以on_开头的槽去自动寻找一个对应的信号,如果不满足匹配条件,均会提示无法为槽寻找到正确的信号,对于非on_开头的槽,不会进行自动处理。
注意这个on_objectname_signal()是定义在Qwindow这个类与对象中的!!!
Qt 开发中关于 connectSlotsByname 的心得_Nicholas.Xu.的专栏-CSDN博客
Qt中Ui名字空间以及setupUi函数的原理和实现 - findumars - 博客园
|