• 9115阅读
  • 0回复

【摘录】《KDE2/Qt编程金典》第四章:显示弹出式对话框——4.6 使用KDialogBase构建对话框 [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 正序阅读 楼主  发表于: 2005-09-28
  下面的例子程序使用KDialogBase作为对话框的基类,此对话框可以让用户输入一行文本和两个整数的值.在这个例子中,输入对话框中的信息被用来改变一个标签显示的文本以及改变主窗口的大小.
  
Mainline

1 /* kdbdata.cpp */
2 #include <kapp.h>
3 #include <kcmdlineargs.h>
4 #include “mainwidget.h”
5
6 int main(int argc,char **argv)
7 {
8 KCmdLineArgs::init(argc,argv,”kdbdata”,
9 “KDialogBase demo”,”0.0”);
10 KApplication app;
11 MainWidget mainwidget;
12 mainwidget.show();
13 app.setMainWidget(&mainwidget);
14 return(app.exec());
15 }


  在第11行主程序创建了MainWidget,在第13行将它设置为应用程序主窗口.
  在第10行创建了KApplication对象,没有使用参数.这样做是因为在第8行调用了KCmdLineArgs类的静态方法init().KCmdLineArgs类存储命令行参数,以及其它信息,并且使得程序的其它部分也可以使用这些参数和信息.
MainWidget Header

1 /* mainwidget.h */
2 #ifndef MAINWIDGET_H
3 #define MAINWIDGET_H
4
5 #include <qwidget.h>
6 #include <qpushbutton.h>
7 #include <qlabel.h>
8
9 class MainWidget: public QWidget
10 {
11 Q_OBJECT
12 public:
13 MainWidget(QWidget *parent=0,const char *name=0);
14 private:
15 QLabel *label;
16 QPushButton *button;
17 private slots:
18 void popupKdb();
19 void slotSettings(QString &,int,int);
20 };
21
22 #endif


  这个部件是应用程序的主窗口.它只包含了一个按钮和一个标签.命名为popupKdb()的slot用来弹出对话框.slot方法slotSettings()接收对话框返回的值.
MainWidget

1 /* mainwidget.cpp */
2 #include “mainwidget.h”
3 #include “modify.h”
4 #include <qpushbutton.h>
5 #include <kdialogbase.h>
6
7 MainWidget::MainWidget(QWidget *parent,const char *name)
8 : QWidget(parent,name)
9 {
10 setMinimumSize(200,140);
11
12 QString str(“Modify Me”);
13 label = new QLabel(str,this);
14 label->setAlignment(Qt::AlignCenter);
15 label->setGeometry(50,20,100,40);
16
17 button = new QPushButton(“Modify”,this);
18 button->setGeometry(50,80,100,40);
19 connect(button,SIGNAL(clicked()),
20 this,SLOT(popupKdb()));
21 resize(10,10);
22 }
23 void MainWidget::popupKdb()
24 {
25 Modify *modify = new Modify(this,”modify”);
26 connect(
27 modify,SIGNAL(signalSettings(QString &,int,int)),
28 this,SLOT(slotSettings(QString &,int,int)));
29 modify->exec();
30 delete modify;
31 }
32 void MainWidget::slotSettings(QString &str,
33 int height,int width)
34 {
35 resize(width,height);
36 label->setText(str);
37 }

  这个部件被用做应用程序的主窗口,它只包含了一个标签和一个按钮.这个按钮用来弹出对话框.
  第18行到第20行创建了一个按钮,把它放置在窗口中,并且把它的clicked()信号与局部的slot方法popupKdb()连接起来.popupKdb()slot,从第23行开始,创建了一个修改对话框,并把对话框的名为signalSettings()的信号与名为slotSettings()的局部slot连接起来.调用exec(),则显示对话框,并一直保持等待状态,直到被关闭.
  第32行开始的名为slotSettings()的slot接收三个值作为参数,然后使用这三个值指定主窗口的大小,以及指定在主窗口中显示的标签文本.第35行调用的resize()方法并不能在第10行指定的最小尺寸之下再减小窗口的尺寸,但它可以将窗口的尺寸调整得大一些.
Modify Header

1 /* modify.h */
2 #ifndef MODIFY_H
3 #define MODIFY_H
4
5 #include <kdialogbase.h>
6 #include <qlineedit.h>
7 #include <qpushbutton.h>
8
9 class Modify: public KDialogBase
10 {
11 Q_OBJECT
12 public:
13 Modify(QWidget *parent=0,const char *name=0);
14 private:
15 QLineEdit *lineedit;
16 QLineEdit *width;
17 QLineEdit *height;
18 private slots:
19 void slotSendValues();
20 signals:
21 void signalSettings(QString &,int,int);
22 };
23
24 #endif

  这段程序是对话框的头文件.它直接由KDialogBase继承而来,然后定义了自己的slot和信号.
  程序中定义了名为slotSendValues()的slot接收对话框中按钮的响应.无论何时执行slotSendValues(),它都将发送名为signalSettings()的信号,信号中带有新的文本和尺寸.
  对话框本身是直接从KDialogBase继承而来的,由此大多数的工作已经做好了.只需要加入输入文本和数据的widget,以及加入任意时候都可以发送的信号,信号中用户指定了新的一套参数值,这部分工作在下面的程序代码中完成.
Modify

1 /* modify.cpp */
2 #include “modify.h”
3 #include <qlayout.h>
4 #include <qlabel.h>
5
6 Modify::Modify(QWidget *parent,const char *name)
7 : KDialogBase(parent,name,TRUE,”Modify”)
8 {
9 QWidget *mainWidget = new QWidget(this,”modifymain”);
10
11 QVBoxLayout *vLayout = new QVBoxLayout(mainWidget,10);
12
13 lineedit = new QLineEdit(mainWidget);
14 vLayout->addWidget(lineedit);
15
16 QHBoxLayout *hLayout = new QHBoxLayout();
17 vLayout->addLayout(hLayout);
18
19 QLabel *wLabel = new QLabel(“width:”,this);
20 wLabel->setAlignment(Qt::AlignCenter);
21 hLayout->addWidget(wLabel);
22 width = new QLineEdit(mainWidget);
23 width->setMaximumWidth(50);
24 hLayout->addWidget(width);
25 QLabel *hLabel = new QLabel(“height:”,this);
26 hLabel->setAlignment(Qt::AlignCenter);
27 hLayout->addWidget(hLabel);
28 height = new QLineEdit(mainWidget);
29 height->setMaximumWidth(50);
30 hLayout->addWidget(height);
31
32 connect(this,SIGNAL(okClicked(void)),
33 this,SLOT(slotSendValues(void)));
34 connect(this,SIGNAL(applyClicked(void)),
35 this,SLOT(slotSendValues(void)));
36
37 setMainWidget(mainWidget);
38 }
39 void Modify::slotSendValues()
40 {
41 QString text = lineedit->text();
42 int w = (width->text()).toInt();
43 int h = (height->text()).toInt();
44 emit signalSettings(text,h,w);
45 }

  第6行开始的构造函数,把它的参数传递给基类.在基类中的调用增加了两个参数,用来指定模式对话框以及设置窗口标题.
  在第9行创建了一个空的部件,这个部件内增加了第11行创建的垂直框布局.在第13行和第14行,向垂直框的上部插入了一个QLineEdit部件.第16行创建了一个水平框,用来确定垂直框部件的第二个框中的各个部件.第20行到第30行,向水平框中加入了QLabel和QLineEdit部件.在第37行,这个布置好了的部件被加入到对话框中,作为对话框的主窗口.
  按钮选择为默认选项,因此对话框中显示出来的按钮有对话框所包含的OK, Cancel以及Apply按钮.无论何时选择Cancel按钮,都将关闭对话框.在这个例子中,并没有设置对Cancel按钮的响应;它的信号被忽略了.在第32行和第34行调用的两个connect()方法将引起名为slotSendValues()的slot方法的执行.这两个连接是来自this,并且返回到this, 这是因为slot和信号都在同一个对象中--信号是继承而来的,而slot被定义为局部的.
  第39行开始的slot方法收集了用户输入的信息,并且使用这些数据来发送信号.从Lineedit返回的文本用来修改标签的标题,所以它可以保持同样的数据格式.宽度和高度的LineEdit对象也将返回QString对象,但它们必须被转换成int型的值,这时需要调用toInt().
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个