这种方法只需要在Design生成的文件中加一个父类就可以了,相当实用。并不需要过多修改Design生成的原代码。
先用Design建一个窗体如下:
<ui version="4.0" >
 <author></author>
 <comment></comment>
 <exportmacro></exportmacro>
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow" >
  <property name="geometry" >
   <rect>
    <x>0</x>
    <y>0</y>
    <width>464</width>
    <height>332</height>
   </rect>
  </property>
  <property name="windowTitle" >
   <string>MainWindow</string>
  </property>
  <property name="windowIcon" >
   <iconset/>
  </property>
  <property name="windowIconText" >
   <string>333</string>
  </property>
  <property name="windowModified" >
   <bool>true</bool>
  </property>
  <widget class="QWidget" name="centralWidget" >
   <widget class="QTextEdit" name="textEdit" >
    <property name="geometry" >
     <rect>
      <x>10</x>
      <y>20</y>
      <width>441</width>
      <height>261</height>
     </rect>
    </property>
    <property name="sizePolicy" >
     <sizepolicy>
      <hsizetype>4</hsizetype>
      <vsizetype>4</vsizetype>
      <horstretch>1</horstretch>
      <verstretch>0</verstretch>
     </sizepolicy>
    </property>
    <property name="frameShape" >
     <enum>QFrame::WinPanel</enum>
    </property>
    <property name="frameShadow" >
     <enum>QFrame::Plain</enum>
    </property>
    <property name="verticalScrollBarPolicy" >
     <enum>Qt::ScrollBarAsNeeded</enum>
    </property>
    <property name="documentTitle" >
     <string>222</string>
    </property>
    <property name="lineWrapMode" >
     <enum>QTextEdit::WidgetWidth</enum>
    </property>
   </widget>
   <widget class="QPushButton" name="pushButton" >
    <property name="geometry" >
     <rect>
      <x>154</x>
      <y>290</y>
      <width>101</width>
      <height>23</height>
     </rect>
    </property>
    <property name="text" >
     <string>UseDefButton</string>
    </property>
   </widget>
  </widget>
 </widget>
 <pixmapfunction></pixmapfunction>
 <resources/>
 <connections/>
</ui>
然后把它生成一个叫a.h的文件,如下
#ifndef FORM1_H
#define FORM1_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QMainWindow>
#include <QtGui/QPushButton>
#include <QtGui/QTextEdit>
#include <QtGui/QWidget>
class Ui_MainWindow:public QMainWindow//把这个类作为QMainWindow的派生类,不然moc不能正确处理
{
public:
    QWidget *centralWidget;
    QTextEdit *textEdit;
    QPushButton *pushButton;
    void setupUi(QMainWindow *MainWindow)
    {
    MainWindow->setObjectName(QString::fromUtf8("MainWindow"));
    MainWindow->resize(QSize(464, 332).expandedTo(MainWindow->minimumSizeHint()));
    MainWindow->setWindowIcon(QPixmap());
    MainWindow->setWindowModified(true);
    centralWidget = new QWidget(MainWindow);
    centralWidget->setObjectName(QString::fromUtf8("centralWidget"));
    textEdit = new QTextEdit(centralWidget);
    textEdit->setObjectName(QString::fromUtf8("textEdit"));
    textEdit->setGeometry(QRect(10, 20, 441, 261));
    QSizePolicy sizePolicy((QSizePolicy::Policy)4, (QSizePolicy::Policy)4);
    sizePolicy.setHorizontalStretch(1);
    sizePolicy.setVerticalStretch(0);
    sizePolicy.setHeightForWidth(textEdit->sizePolicy().hasHeightForWidth());
    textEdit->setSizePolicy(sizePolicy);
    textEdit->setFrameShape(QFrame::WinPanel);
    textEdit->setFrameShadow(QFrame::Plain);
    textEdit->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
    textEdit->setLineWrapMode(QTextEdit::WidgetWidth);
    pushButton = new QPushButton(centralWidget);
    pushButton->setObjectName(QString::fromUtf8("pushButton"));
    pushButton->setGeometry(QRect(154, 290, 101, 23));
    MainWindow->setCentralWidget(centralWidget);
    retranslateUi(MainWindow);
    QMetaObject::connectSlotsByName(MainWindow);
    } // setupUi
    void retranslateUi(QMainWindow *MainWindow)
    {
    MainWindow->setWindowTitle(QApplication::translate("MainWindow", "MainWindow"));
    MainWindow->setWindowIconText(QApplication::translate("MainWindow", "333"));
    textEdit->setDocumentTitle(QApplication::translate("MainWindow", "222"));
    pushButton->setText(QApplication::translate("MainWindow", "UseDefButton"));
    Q_UNUSED(MainWindow);
    } // retranslateUi
};
namespace Ui {
    class MainWindow: public Ui_MainWindow {};
} // namespace Ui
#endif // FORM1_H
手写一个b.h的适配器定义文件
#ifndef B_H
#define B_H
#include "a.h"
class TForm1:public Ui_MainWindow
{
Q_OBJECT
public:
       TForm1();
public slots:
       void TMessage();
};
#endif // B_H
然后在写一个适配器的实现b.cpp
#include <QMessageBox>
#include <QString>
#include "b.h"
TForm1::TForm1()
{    
}
void TForm1::TMessage()
{
         QMessageBox::information(NULL, "Application name",
    "Unable to find the user preferences file.\n"
    "The factory default will be used instead.");     
}
我的signal和slot连接并没有写在适配器里,是在写调用函数里的
最后写一个main.cpp的主文件,如下
#include <QApplication>
#include <QtGui/QtGui>
#include "b.h"
int main(int argc, char **argv)
{
  QApplication app(argc, argv);
  QMainWindow form1;
  TForm1 Main;
  Main.setupUi(&form1);
  QObject::connect(Main.pushButton, SIGNAL(clicked()),&Main, SLOT(TMessage()));
  form1.show();
  return app.exec();              
}
编译执行就可以得到结果了。
以下给出全部源代码
[ 此贴被fanyu在2005-09-27 09:46重新编辑 ]