1、 curImage.setAlphaBuffer(true); resizeContents(); /此函数用于管理初始窗口部件获取自己的大小void ImageEditor:resizeContents() QSize size = zoom*curImage.size(); if(zoom = 3) size += QSize(1,1); /若zoom大于等于3,size则放大一格 QScrollView:resizeContents(size.width(), size.height();/QScrollView是否显示滚动条由窗口的大小决定setImage(const QImage &
2、newImage) /获取所要显示的图片 if(newImage != curImage) curImage = newImage.convertDepth(32); curImage.detach(); /重新获得大小 updateContents();/重新绘制图片 contentsMousePressEvent(QMouseEvent *event) /鼠标点击事件 if(event-button() = LeftButton) /左击事件 setImagePixel(event-pos(), true); elsebutton() = RightButton) /右击事件pos(),
3、false);cotentMouseMoveEvent(QMouseEvent *event) /鼠标按住拖动事件state() & LeftButton) /左击事件 RightButton) /右击事件int main(int argc, char *argv) QApplication app(argc, argv); ImageEditor *imageEditor = new ImageEditor; imageEditor-setImage(QImage:QImage(mouse.png,0); /加载资源图片mouse.png app.setMainWidget(imageEdi
4、tor);show(); /显示窗口 return app.exec();多文档界面的Editor运行结果:MainWindow:MainWindow(QWidget *parent, const char *name) QMainWindow(parent, name) workspace = new QWorkspace(this); /创建一个窗口部件 setCentralWidget(workspace); /使其成为中央窗口部件 connect(workspace, SIGNAL(windowActivated(QWidget *), this, SLOT(updateMenus()
5、; connect(workspace, SIGNAL(windowActivated(QWidget *), /槽用于保持菜单栏和状态栏总是用于反应,当前激活子菜单的窗口状态。 this, SLOT(updateModIndicator(); createActions(); createMenus(); createToolBars(); createStatusBar(); setCaption(tr(Editor); setIcon(QPixmap:fromMimeSource(icon.pngvoid MainWindow:updateMenus() /只要一个窗口被激活或最后一个被
6、关闭,updatemenu就会被调用 bool hasEditor = (activeEditor() != 0); saveAct-setEnabled(hasEditor); saveAsAct- pasteAct- deleteAct- copyAvailable(activeEditor() & activeEditor()-hasSelectedText(); closeAct- closeAllAct- tileAct- cascadeAct- nextAct- previousAct- windowsMenu-clear(); /若不存在激活的窗口,清空windows菜单 cre
7、ateWindowsMenu();2. 编写程序ch_501,实现程序界面如下:下方文本框可以输入内容(保存类型为All Files(*.*),所有菜单及工具按钮均可实现功能。File菜单如下:Help菜单如下:About菜单为:About Qt菜单为实验过程:1. 运行结果:2、 完成书本第七部分“事件处理”中的例题Ticker;#include #include ticker.hTicker:Ticker(QWidget *parent, const char *name) QWidget(parent, name) offset = 0; /设置被绘制文本X坐标 myTimerId =
8、0; /定时器标示器void Ticker:setText(const QString &newText) myText = newText; update(); /强制重新绘制 updateGeometry(); /提示ticker窗口布局的变化QSize Ticker:sizeHint() const return fontMetrics().size(0, text();paintEvent(QPaintEvent *) QPainter painter(this); int textWidth = fontMetrics().width(text(); /确定文版需要多少水平空间 if
9、 (textWidth 1) return; int x = -offset; while (x timerId() = myTimerId) +offset; if (offset = fontMetrics().width(text() scroll(-1, 0); /左移一个像素 else QWidget:timerEvent(event);hideEvent(QHideEvent *) killTimer(myTimerId); /当文本消失时,释放对应的定时器3、 请按下列程序源代码,编写ch_601,并在程序后进行注释:ch_601.cpp的源程序为:qtimer.hqapplic
10、ation.hqtextcodec.hstdlib.hch_601.hch_601:ch_601(QWidget *parent, const char *name):QWidget(parent,name) for(int a=0 ; a start(1000);void ch_601:updateCaption() QString s; s.sprintf(QObject:tr(QTimer实例),rectangles); /设置caption为“QTimer实例”和举行数 setCaption(s); QPainter paint(this); int w = width(); /宽w
11、int h = height(); /高h if(w = 0 | h = 0) /若w=0或h=0 return ; /返回 paint.setPen(NoPen); /若没有画笔则设置画笔 paint.setBrush(colorsrand() % numColors); /画刷颜色随机 QPoint p1(rand()%w,rand()%h); /设置矩形的位置 QPoint p2(rand()%w,rand()%h); QRect r(p1,p2); paint.drawRect(r); /画矩形timerEvent(QTimerEvent *) for(int i =0 ; i con
12、st int numColors = 120;class Ch_601 : public QWidget Q_OBJECTpublic: Ch_601( QWidget *parent=0, const char *name=0 );protected: void paintEvent( QPaintEvent * ); void timerEvent( QTimerEvent * );private slots: void updateCaption();private: int rectangles; QColor colorsnumColors;#endifCh_601运行结果:4、 请
13、按下列程序源代码(其中主程序自编),编写ch_602,并在程序后进行注释:progressbar.hqradiobutton.hqpushbutton.hqprogressbar.hqlayout.hqmotifstyle.hProgressBar:ProgressBar(QWidget *parent , const char *name )QButtonGroup(0, Horizontal, QObject:进度条测试), parent, name), timer() setMargin(10); /设置边距 QGridLayout* toplayout = new QGridLayou
14、t(layout(), 2,2, 5); / 设置空间组 setRadioButtonExclusive(TRUE); /按键单一选择 slow = new QRadioButton(QObject:低速),this); /设置低速,中速,高速三个选项 normal = new QRadioButton(QObject:中速), this); fast = new QRadioButton(QObject:高速 QVBoxLayout* vb1 = new QVBoxLayout; /新建一个box toplayout-addLayout(vb1, 0, 0); /嵌套布局 vb1-addWi
15、dget(slow); /添加slow,normal,fast到布局addWidget(normal);addWidget(fast); start = new QPushButton(QObject:开始 /新建开始按钮 reset = new QPushButton(QObject:重启 /新建重启按钮 QVBoxLayout* vb2 = new QVBoxLayout;addLayout(vb2, 0, 1); vb2-addWidget(start);addWidget(reset); progress = new QProgressBar(100, this); /添加进度条add
16、MultiCellWidget(progress, 1, 1, 0, 1); /1列插入progressbar占2行2列 connect(start, SIGNAL(clicked(), this, SLOT(slotStart(); / 点击开始触发开始槽 connect(reset, SIGNAL(timeout(), this, SLOT(slotTimeout(); /点击重置触发timeout槽 normal-setChecked(TRUE); /默认选中设置为中速 start-setFixedWidth(80); /设置最大最小宽度为80 setMinimumWidth(300);
17、 /设置最小宽度300 void ProgressBar:slotStart() if(progress-progress() = -1) if(slow-isChecked() progress-setTotalSteps(10000); /slow进度条满需10000小时 else if(normal-setTotalSteps(1000); /normal进度条满需1000小时setTotalSteps(50); /fast进度条满需50小时 slow-setEnabled(FALSE); /slow不能选中 /normal不能选中 fast- /fast不能选中 if(!timer.i
18、sActive() /若时钟未被激活 timer.start(1); /时钟设置为1setText(QObject:暂停 timer.stop(); /时间停止继续slotReset() /进度条重置setEnabled(TRUE); /start可以被选择 /slow可以被选择 /normal可以被选择 /fast可以被选择 reset(); /进度条重置slotTimeout() int p = progress-progress(); /声明p,用于保存进度条 #if 1 if(p = progress-totalSteps() /若进度条满 #endifsetProgress(+p);
19、processbar.h的源程序为:#ifndef PROGRESSBAR_H#define PROGRESSBAR_Hqbuttongroup.hclass QRadioButton;class QPushButton;class QProgressBar;class ProgressBar : public QButtonGroup ProgressBar( QWidget *parent = 0, const char *name = 0 ); QRadioButton *slow, *normal, *fast; QPushButton *start, *pause, *reset; QProgressBar *progress; QTimer timer;protected slots: void slotStart(); void slotReset(); void slotTimeout();Main.cpp源程序为: ProgressBa
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1