• 10647阅读
  • 1回复

【原创】Qt Design的设计模式 [复制链接]

上一主题 下一主题
离线fanyu
 
只看楼主 倒序阅读 楼主  发表于: 2005-09-24
这种方法只需要在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重新编辑 ]
附件: a3.tar.gz (27 K) 下载次数:36
附件: a3.rar (33 K) 下载次数:39
离线handsoft

只看该作者 1楼 发表于: 2005-09-24
qt的signal和slot机制很精确!呵呵!老大我有点看不明白!俺还菜!多多学习了!
microtiger@gmail.com
快速回复
限100 字节
 
上一个 下一个