搜档网
当前位置:搜档网 › qt特效

qt特效

qt特效
qt特效

void QMainWindow::tabifyDockWidget ( QDockWidget * first, QDockWidget * second )

qt可停靠控件和工具栏(Dock Widgets and Toolbars)qt 2010-04-19 11:51:47 阅读386 评论0字号:大中小订阅

可停靠控件能够停靠在QMainWindow中或者作为一个独立窗口浮动。QMainWindow提供了四个可停靠控件的地方:上方,下方,左方,右方。Microsoft Visual Stadio程序和Qt Linguist程序使用大量的可停靠窗口实现更为复杂的用户界面。在Qt中,可停靠窗口是QDockWidget的一个实例。

每一个可停靠控件都有一个标题条。用户可以拖动标题栏把窗口从一个可停靠区域移动到另一个可停靠区域。拖动标题栏把窗口移动到不能停靠的区域,窗口就浮动为一个独立的窗口。自由浮动的窗口总是在主窗口的上面。用户点击标题栏上的关闭按钮可以关闭QDockWidget。调用QDockWidget::setFeatures()能够设置以上这些属性。

在Qt的早期版本中,工具条也是作为可停靠控件,可以放置在任何可停靠区域中。从Qt4开始,工具条有了自己的位置,不能再浮动了,如果需要一个可停靠的工具条,我们可以把它放到QDockWindow里面。

用点线表示的四个角落可以属于任何一个相邻的可停靠区域。例如,调用QMainWindow::setCorner(Qt::TopLeftCorner,Qt::LeftDockWidgetArea)把左上角作为左侧的停靠区域。

下面的代码将一个现有的控件(如QTreeWidget)放置到QDockWidget中,停靠再右边的停靠区域。

QDockWidget *shapesDockWidget = new QDockWidget(tr("Shapes")); shapesDockWidget->setWidget(treeWidget);

shapesDockWidget->setAllowedAreas(Qt::LeftDockWidgetArea

| Qt::RightDockWidgetArea);

addDockWidget(Qt::RightDockWidgetArea, shapesDockWidget);

函数setAllowAreas()确定控件可停靠的位置。在上面的代码允许用户把窗口拖动到左边或者右边的可停靠区域,这两个地方垂直控件足够显示一个树型控件。如果没有指定停靠区域,用户可以拖动控件到任何四个可停靠的区域。

下面的代码创建一个工具栏,包含一个QComboBox,QSpinBox和一些QToolButton,代码为QMainWindow子类的构造函数的一部分:

QToolBar *fontToolBar = new QToolBar(tr("Font"));

fontT oolBar->addWidget(familyComboBox);

fontT oolBar->addWidget(sizeSpinBox);

fontT oolBar->addAction(boldAction);

fontT oolBar->addAction(italicAction);

fontT oolBar->addAction(underlineAction);

fontT oolBar->setAllowedAreas(Qt::TopToolBarArea

| Qt::BottomToolBarArea);

addToolBar(fontToolBar);

如果我们需要在下一次运行程序时恢复所有可停靠控件和工具栏的位置,可以使用和保存QSplitter状态相似的代码:

void MainWindow::writeSettings()

{

QSettings settings("Software Inc.", "Icon Editor");

settings.beginGroup("mainWindow");

settings.setValue("size", size());

settings.setValue("state", saveState());

settings.endGroup();

}

void MainWindow::readSettings()

{

QSettings settings("Software Inc.", "Icon Editor");

settings.beginGroup("mainWindow");

resize(settings.value("size").toSize());

restoreState(settings.value("state").toByteArray());

settings.endGroup();

}

QMainWindow提供了一个上下文菜单,列出了所有可停靠的窗口和工具栏。用户可以通过这个菜单关闭显示停靠窗口和工具栏。

QT,停靠窗口

创建一个停靠窗口对象:

dockWidge = new QDockWindow(QDockWindow::InDock, this, "DockWindow");

dockWidge->setResizeEnabled(true);//浮动窗口可以改变大小。

dockWidge->setVerticalStretchable(true);//浮动窗口在垂直方向可以随着父窗口大小的改变而改变。dockWidge->setCloseMode( QDockWindow::Always );//可以关闭

setDockEnabled( dockWidge, Qt::DockTop, FALSE )//不可置于顶部

setDockEnabled( dockWidge, Qt::DockBottom, FALSE )//不可置于底部

addDockWindow(dockWidge,Qt::DockLeft);//添加到住窗口

在停靠窗口上创建一个器件:

CTabNameList * = g_TabNameList = new CTabNameList(pDocTabName);

dockWidge = setWidget( g_TabNameList );

翻页(folding)特效的实现

翻页(folding)特效在UI 中用的多,如转场、电子书的翻页等。翻页(folding) 效果如下图所示:

图1. from 参考资料1

实现folding 特效有很多方法,包括2D 的和3D 的,下面将分别介绍。

2D 方法

总的思路是:截屏+ 直角三角形+ 三边形(bezier1/bezier2/line) + timer 更新。如下图所示。

图2. folding特效分解

folding 特效可分解成三部分:

1未翻完的部分,如图2的区域1;

2翻过去,露出的底图部分,如图2的区域2;

3褶皱部分,如图2的区域3。

仔细分析,可以得到如下的思路:

4区域1是个五变形,用上层的图填充;

5区域2是个直角三角形,用下层的图填充;

6区域3是由两条bezier 曲线加一条直线构成的三边形,区域3和区域1之间运用半透明效果。

已知鼠标当前位置(x, y)、窗口width 和height,很容易算出三个区域各个顶点的坐标,见图2。根据顶点坐标,通过path 接口,可以画出三个区域的形状。再通过设置剪切域(clip),就可以在三个区域中绘制想要的图形。

以QT为例,伪代码如下所示:

... ...

// set composition mode

painter->setCompositionMode (QPainter::CompositionMode_Source); QPainterPath path;

/* Draw region 1 */

painter->save ();

path.moveTo (0,0);

path.lineTo (mouse_pos.x, 0);

path.lineTo (WIN_WIDTH, mouse_pos.y);

path.lineTo (WIN_WIDTH,WIN_HEIGHT);

path.lintTo (0, WIN_HEIGHT);

path.closeSubpath ();

painter->setClipPath (path);

painter->drawPixmap (0,0, image_up);

painter->restore();

/*Draw region 2*/

painter->save();

path.clear();

path.moveTo (mouse_pos.x, 0);

path.lineTo (WIN_WIDTH, mouse_pos.y);

path.lineTo (WIN_WIDTH, 0);

path.closeSubpath ();

painter->setClipPath (path);

painter->drawPixmap (0,0,image_down);

painter->restore();

/* Draw region 3 */

path.clear();

path.moveTo (mouse_pos.x, 0);

path.cubicTo (c1x, c1y, c2x, c2y, mouse_pos.x, mouse_pos.y);

path.cubicTo (c1x, c1y, c2x, c2y, WIN_WIDTH, mouse_pos.y);

path.closeSubpath ();

painter->setBrush (color);

painter->drawPath (path);

... ...

3D 方法

#include

#include

class Digits: public QWidget

{

Q_OBJECT

public:

/*Define three transition modes of the digital clock*/

enum {

Slide,

Flip,

Rotate

};

Digits(QWidget *parent)

: QWidget(parent)

, m_number(0)

, m_transition(Slide)

{

setAttribute(Qt::WA_OpaquePaintEvent, true);

//Widget paints all its pixels when it receives a paint event

setAttribute(Qt::WA_NoSystemBackground, true);

//Indicates that the widget has no background, i.e. when the widget receives paint events, the background is not automatically repainted.

connect(&m_animator, SIGNAL(frameChanged(int)), SLOT(update()));

//start animation

m_animator.setFrameRange(0, 100);

m_animator.setDuration(600);

//Construct a 0.6-second timeline with a frame range of 0 - 100

m_animator.setCurveShape(QTimeLine::EaseInOutCurve);

//starts growing slowly, then runs steadily, then grows slowly again

}

/*Set transition when time changed*/

void setTransition(int tr) {

m_transition = tr;

}

/*Get transition mode*/

int transition() const {

return m_transition;

}

/*Set hours and minutes*/

void setNumber(int n) {

if (m_number != n) {

m_number = qBound(0, n, 99);

preparePixmap();

update();

}

}

/*Flip to next state*/

void flipTo(int n) {

if (m_number != n) {

m_number = qBound(0, n, 99);

m_lastPixmap = m_pixmap;

preparePixmap();

m_animator.stop();

m_animator.start();

}

}

protected:

/*Draw the main frame of the digits area*/

void drawFrame(QPainter *p, const QRect &rect) {

p->setPen(Qt::NoPen);

QLinearGradient gradient(rect.topLeft(), rect.bottomLeft());

//Set linear gradient area

gradient.setColorAt(0.00, QColor(245, 245, 245));

gradient.setColorAt(0.49, QColor(192, 192, 192));

gradient.setColorAt(0.51, QColor(245, 245, 245));

gradient.setColorAt(1.00, QColor(192, 192, 192));

//Creates stop points at the given position with the given color

p->setBrush(gradient);

QRect r = rect;

p->drawRoundedRect(r, 15, 15, Qt::RelativeSize);

/*

Draws outer rectangle rect with rounded corners.

Qt::RelativeSize specifies the size relative to the bounding rectangle,

typically using percentage measurements.

*/

r.adjust(1, 4, -1, -4);

//Adds 1, 4, -1 and -4 respectively to the existing coordinates of the rectangle

p->setPen(QColor(181, 181, 181));

p->setBrush(Qt::NoBrush);

p->drawRoundedRect(r, 15, 15, Qt::RelativeSize);

//Draws inner rectangle rect with rounded corners.

p->setPen(QColor(159, 159, 159));

int y = rect.top() + rect.height() / 2 - 1;

p->drawLine(rect.left(), y, rect.right(), y);

//Draws the mid-line from (rect.left(), y) to (rect.right(), y) and sets the current pen position to (rect.right(), y)

}

/*Draw the digits*/

QPixmap drawDigits(int n, const QRect &rect) {

int scaleFactor = 2;

#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)

if (rect.height() > 240)

scaleFactor = 1;

#endif

QString str = QString::number(n);

if (str.length() == 1)

str.prepend("0");

//Ensure it is double-digit

QFont font;

font.setFamily("Helvetica");

int fontHeight = scaleFactor * 0.55 * rect.height();

font.setPixelSize(fontHeight);

//Sets the font size to pixelSize pixels

font.setBold(true);

QPixmap pixmap(rect.size() * scaleFactor);

pixmap.fill(Qt::transparent);

QLinearGradient gradient(QPoint(0, 0), QPoint(0, pixmap.height()));

//Constructs a linear gradient with interpolation area between (0,0) and (0,pixmap.height())

gradient.setColorAt(0.00, QColor(128, 128, 128));

gradient.setColorAt(0.49, QColor(64, 64, 64));

gradient.setColorAt(0.51, QColor(128, 128, 128));

gradient.setColorAt(1.00, QColor(16, 16, 16));

//Creates stop points at the given position with the given color

QPainter p;

p.begin(&pixmap);

p.setFont(font);

QPen pen;

pen.setBrush(QBrush(gradient));

//Set penbrush with linergrident

p.setPen(pen);

p.drawText(pixmap.rect(), Qt::AlignCenter, str);

//Draws the digit number(str here) within the provided rectangle

p.end();

return pixmap.scaledToWidth(width(), Qt::SmoothTransformation);

//Returns a scaled copy of the image which is transformed using bilinear filtering }

/*prepare the pixmap */

void preparePixmap() {

m_pixmap = QPixmap(size());

m_pixmap.fill(Qt::transparent);

//Fills the pixmap with the given transparent black value (i.e., QColor(0, 0, 0, 0))

QPainter p;

p.begin(&m_pixmap);

p.drawPixmap(0, 0, drawDigits(m_number, rect()));

//Draws the given digits-pixmap at position (0, 0)

p.end();

}

/*define a resize event*/

void resizeEvent(QResizeEvent*) {

preparePixmap();

update();//Causes a paintEvent() call

}

/*Paint the static state*/

void paintStatic() {

QPainter p(this);

p.fillRect(rect(), Qt::black);

//Fill the widget rec with black color

int pad = width() / 10;

drawFrame(&p, rect().adjusted(pad, pad, -pad, -pad));

p.drawPixmap(0, 0, m_pixmap);

}

/*Paint the slide state*/

void paintSlide() {

QPainter p(this);

p.fillRect(rect(), Qt::black);

int pad = width() / 10;

QRect fr = rect().adjusted(pad, pad, -pad, -pad);

drawFrame(&p, fr);

p.setClipRect(fr);

//sets the clip region to the given rectangle using the given clip operation

int y = height() * m_animator.currentFrame() / 100;

p.drawPixmap(0, y, m_lastPixmap);

//Draw last-time state pixmap from 0 to height()(Y Coordinate) in 0.6 second

p.drawPixmap(0, y - height(), m_pixmap);

//Draw current-time state pixmap from -height() to 0 (Y Coordinate) in 0.6 second }

/*Paint the flip state*/

void paintFlip() {

QPainter p(this);

#if !defined(Q_OS_SYMBIAN) && !defined(Q_OS_WINCE_WM)

p.setRenderHint(QPainter::SmoothPixmapTransform, true);

p.setRenderHint(QPainter::Antialiasing, true);

#endif

p.fillRect(rect(), Qt::black);

int hw = width() / 2;

int hh = height() / 2;

// behind is the new pixmap

int pad = width() / 10;

QRect fr = rect().adjusted(pad, pad, -pad, -pad);

drawFrame(&p, fr);

p.drawPixmap(0, 0, m_pixmap);

int index = m_animator.currentFrame();

if (index <= 50) {

// the top part of the old pixmap is flipping

int angle = -180 * index / 100;

QTransform transform;

transform.translate(hw, hh);

//Moves the coordinate system to the center of widget

transform.rotate(angle, Qt::XAxis);

//Rotates the coordinate system counterclockwise by angle about the X axis

p.setTransform(transform);

drawFrame(&p, fr.adjusted(-hw, -hh, -hw, -hh));

p.drawPixmap(-hw, -hh, m_lastPixmap);

// the bottom part is still the old pixmap

p.resetTransform();

p.setClipRect(0, hh, width(), hh);

//Enables clipping, and sets the clip region to the rectangle beginning at (0, hh) with the given width and height

drawFrame(&p, fr);

p.drawPixmap(0, 0, m_lastPixmap);

} else {

p.setClipRect(0, hh, width(), hh);

// the bottom part is still the old pixmap

drawFrame(&p, fr);

p.drawPixmap(0, 0, m_lastPixmap);

// the bottom part of the new pixmap is flipping

int angle = 180 - 180 * m_animator.currentFrame() / 100;

QTransform transform;

transform.translate(hw, hh);

transform.rotate(angle, Qt::XAxis);

p.setTransform(transform);

drawFrame(&p, fr.adjusted(-hw, -hh, -hw, -hh));

p.drawPixmap(-hw, -hh, m_pixmap);

}

}

/*Paint the rotate state*/

void paintRotate() {

QPainter p(this);

int pad = width() / 10;

QRect fr = rect().adjusted(pad, pad, -pad, -pad);

drawFrame(&p, fr);

p.setClipRect(fr);

int angle1 = -180 * m_animator.currentFrame() / 100;

int angle2 = 180 - 180 * m_animator.currentFrame() / 100;

int angle = (m_animator.currentFrame() <= 50) ? angle1 : angle2;

QPixmap pix = (m_animator.currentFrame() <= 50) ? m_lastPixmap : m_pixmap;

QTransform transform;

transform.translate(width() / 2, height() / 2);

transform.rotate(angle, Qt::XAxis);

p.setTransform(transform);

p.setRenderHint(QPainter::SmoothPixmapTransform, true);

p.drawPixmap(-width() / 2, -height() / 2, pix);

}

void paintEvent(QPaintEvent *event) {

Q_UNUSED(event);

if (m_animator.state() == QTimeLine::Running) {

if (m_transition == Slide)

paintSlide();

if (m_transition == Flip)

paintFlip();

if (m_transition == Rotate)

paintRotate();

} else {

paintStatic();

}

}

private:

int m_number;//number to set to digits

int m_transition;//transition mode(change effect)

QPixmap m_pixmap;//current time pixmap

QPixmap m_lastPixmap;//next state time pixmap

QTimeLine m_animator;

//used to animate a GUI control by calling a slot periodically

//The timeline's duration describes for how long the animation will run

//connect the frameChanged() signal to a suitable slot in the widget you wish to animate

};

class DigiFlip : public QMainWindow

{

Q_OBJECT

public:

DigiFlip(QWidget *parent = 0)

: QMainWindow(parent)

{

m_hour = new Digits(this);

m_hour->show();

m_minute = new Digits(this);

m_minute->show();

QPalette pal = palette();

pal.setColor(QPalette::Window, Qt::black);

//Sets the color used for the given color role, in all color groups, to the specified solid color.

setPalette(pal);

m_ticker.start(1000, this);

//Send a timer event every second

QTime t = QTime::currentTime();

m_hour->setNumber(t.hour());

m_minute->setNumber(t.minute());

updateTime();

QAction *slideAction = new QAction("&Slide", this);

QAction *flipAction = new QAction("&Flip", this);

QAction *rotateAction = new QAction("&Rotate", this);

connect(slideAction, SIGNAL(triggered()), SLOT(chooseSlide()));

connect(flipAction, SIGNAL(triggered()), SLOT(chooseFlip()));

connect(rotateAction, SIGNAL(triggered()), SLOT(chooseRotate())); #if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)

menuBar()->addAction(slideAction);

menuBar()->addAction(flipAction);

menuBar()->addAction(rotateAction);

#else

addAction(slideAction);

addAction(flipAction);

addAction(rotateAction);

setContextMenuPolicy(Qt::ActionsContextMenu);

//Shows a context menu(right click)

#endif

}

/*Real-time updates*/

void updateTime() {

QTime t = QTime::currentTime();

m_hour->flipTo(t.hour());

m_minute->flipTo(t.minute());

QString str = t.toString("hh:mm:ss");

str.prepend(": ");

if (m_hour->transition() == Digits::Slide)

str.prepend("Slide");

if (m_hour->transition() == Digits::Flip)

str.prepend("Flip");

if (m_hour->transition() == Digits::Rotate)

str.prepend("Rotate");

setWindowTitle(str);

}

/*Switch transition mode*/

void switchTransition(int delta) {

int i = (m_hour->transition() + delta + 3) % 3;

m_hour->setTransition(i);

updateTime();

}

protected:

void resizeEvent(QResizeEvent*) {

int digitsWidth = width() / 2;

int digitsHeight = digitsWidth * 1.2;

int y = (height() - digitsHeight) / 3;

m_hour->resize(digitsWidth, digitsHeight);

m_hour->move(0, y);

m_minute->resize(digitsWidth, digitsHeight);

m_minute->move(width() / 2, y);

}

/*Timer event,receive timer events */

void timerEvent(QTimerEvent*) {

updateTime();

}

/* Get key press event */

void keyPressEvent(QKeyEvent *event) {

if (event->key() == Qt::Key_Right) {

switchTransition(1);

event->accept();

}

if (event->key() == Qt::Key_Left) {

switchTransition(-1);

event->accept();

}

}

private slots:

void chooseSlide() {

m_hour->setTransition(0);

m_minute->setTransition(0);

updateTime();

}

void chooseFlip() {

m_hour->setTransition(1);

updateTime();

}

void chooseRotate() {

m_hour->setTransition(2);

m_minute->setTransition(2);

updateTime();

}

private:

QBasicTimer m_ticker;

Digits *m_hour;

Digits *m_minute;

};

#include "digiflip.moc"

int main(int argc, char *argv[])

{

QApplication app(argc, argv);

DigiFlip time;

//#if defined(Q_OS_SYMBIAN) || defined(Q_OS_WINCE_WM)

// time.showFullScreen();

//#else

time.resize(320, 240);

time.show();

//#endif

return app.exec();

}

Qt4.2引入了QWidget::setWindowOpacity函数,可以为窗体设置透明度,从0.0到1.0之间,值越小越透明。经过设置的窗体可以整体呈现透明的效果。但这种设置比较粗糙,只能设一个整体的效果,大概只有比如像拖动的时候能用一下,大多数时候都不太实用。在Qt4.5里引入了新的窗体透明特性,是个Widget的Attribute,叫做Qt::WA_TranslucentBackground。这个属性可以为每个QWidget单独设置,并且透明程度可以用绘制的颜色或图片的Alpha Channel值来控制。

笔者写了一个例子演示其奇妙的效果。先看一个截图:

这个是笔者例子运行出来的效果,背景是https://www.sodocs.net/doc/3016312383.html,雷人的主页。下面简单介绍一下代码的实现。

TranslucentBackground控制窗体透明属性

例子主界面用QWidget,其上放置四个控件,上面两个是自定义的QWidget子类,用在paintEvent中绘制了一幅透明底色的图片,上书“CuteQt”几个大字;下面两个是标准的QLabel控件,但显示出两种不同的效果。

透明的控件的TranslucentBackground属性为true (继承了parent的属性),而非透明的控件则在代码中强制将TranslucentBackground设为了false,这样就造就了有意思的结果。代码片段如下:

label = new QLabel(”https://www.sodocs.net/doc/3016312383.html,”);

label->setAttribute(Qt::WA_TranslucentBackground, false);

label->setAutoFillBackground(true);

Alpha Channel控制透明度

将这个例子稍稍改动,修改一下窗体背景色的Alpha值,使之展现不同的透明度。实现的方法是设置窗体的palette属性,为Background这个ColorRole的颜色设置了alpha值,代码片段如下:

QPalette pal = palette();

pal.setColor(QPalette::Background, QColor(255,0,0,200));

setPalette(pal);

下图所示为alpha值100和200的不同显示效果。

怎么样,这个例子挺有意思吧?赶快下载完整的代码学习一下吧~有任何不明白blog 或bbs留言~

Qt开发简介

Qt开发简介 诺基亚开发门户网站:https://www.sodocs.net/doc/3016312383.html,/ (资料例程等)Qt开发平台Qt是诺基亚开发的一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所 用功能。Qt是完全面向对象的, 很容易扩展,并且允许真正地组件编程。自从1996年早些时候,Qt进入商业领域,它已经成为全世界范围内数千种成功的应用程序的基础。Qt也是流行的 Linux桌面环境KDE 的基础。基本上,Qt 同X Window 上的Motif,Openwin,GTK 等图形界面库和 Windows 平台上的MFC,OWL,VCL,ATL 是同类型的东西,但Qt具有优良的跨平台特性、面向对象 、丰富的API、大量的开发文档等优点。QT开发环境Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。Qt Creator可带来两大关键益处:提供首个专为支持跨平台开发而设计的集成开发环境(IDE),并确保首次接触Qt 框架的开发人员能迅速上手和操作。Qt Creator包含了一套用于创建和测试基于Qt应用程序的高效工具,包括:一个高级的C++代码编辑器上下文感知帮助系统可视化调试器源代码管理项目和构建管理工具QT for

Symbian 开发环境搭建: https://www.sodocs.net/doc/3016312383.html,/Community/Wiki/Qt_Sym bian_开发环境安装Qt优势面向对象Qt 的良好封装机制使得Qt 的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的。Qt 提供了一种称 为signals/slots 的安全类型来替代callback,这使得各个 元件之间的协同工作变得十分简单。丰富的API Qt包括多达250 个以上的C++ 类,还提供基于模板的collections,serialization,file,I/Odevice,directory management,date/time 类。甚至还包括正则表达式的处理功能。支持2D/3D 图形渲染,支持OpenGL 大量的开发文档XML 支持Webkit 引擎的集成,可以实现本地界面与Web内容的无缝集成但是真正使得Qt 在自由软件界的众多Widgets (如Lesstif,Gtk,EZWGL,Xforms,fltk 等等)中脱颖而出的还是基于Qt 的重量级软件KDE 。我的问题:1:如何用Qt 访问https ?Qt 是支持SSL的,但是由于某些法律和政策因素,QT的开发包里并没有集成openSSL。QT采用两种方式调 用openSSL,默认方式是动态加载openSSL的DLL。 在Windows系统上默认没有openSSL,需要自己安装。可以在这里下载源代码,自己编译 https://www.sodocs.net/doc/3016312383.html,/source/

QT中的网络编程实例

QT中的网络编程实例 Qclient.h /**************************************************************************** ** $Id: /sample/10/qclient.h 2.3.2 edited 2004-10-12 $ ** ** Copyright (C) 2004-2005 OURSELEC AS. All rights reserved. ** https://www.sodocs.net/doc/3016312383.html, ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ #ifndef QCLIENT_H #define QCLIENT_H #include #include #include #include #include #include #include #include #include class QClient : public QWidget { Q_OBJECT public: QClient(QWidget *parent = 0, const char *name = 0); private slots: void closeConnection(); void sendToServer(); void connectToServer(); void socketReadyRead(); void socketConnected(); void socketConnectionClosed(); void socketClosed(); void socketError(int); private: QSocket *socket; QTextView *infoText;

Qt 编写多窗口程序

编写多窗口程序 导语 程序要实现的功能是:程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后,我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 程序里我们先建立一个工程,设计主界面,然后再建立一个对话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 在这一篇还会涉及到代码里中文字符串显示的问题。 目录 一、添加主窗口 二、代码中的中文显示 三、添加登录对话框 四、使用自定义的对话框类 正文 一、添加主窗口 1.我们打开Qt Creator,新建Qt Gui应用,项目名称设置为“nWindows”,在类信息界面保持基类为QMainWindow,类名为MainWindow,这样将会生成一个主窗口界面。 2.完成项目创建后,打开mainwindow.ui文件进入设计模式,向界面上拖入一个Push Button,然后对其双击并修改显示文本为“按钮”,如下图所示。 3.现在运行程序,发现中文可以正常显示。在设计模式可以对界面进行更改,那么使用代码也可以完成相同的功能,下面就添加代码来更改按钮的显示文本。

二、代码中的中文显示 1.我们点击Qt Creator左侧的“编辑”按钮进入编辑模式,然后双击mainwindow.cpp文件对其进行编辑。在构造函数MainWindow()中添加代码: MainWindow::MainWindow(QWidget*parent): QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); ui->pushButton->setText("新窗口");//将界面上按钮的显示文本更改为“新窗口”} 这里的ui对象就是界面文件对应的类的对象,在mainwindow.h文件中对其进行了定义,我们可以通过它来访问设计模式添加到界面上的部件。前面添加的按钮部件Push Button,在其属性面板上可以看到它的objectName属性的默认值为pushButton,这里就是通过这个属性来获取部件对象的。 我们使用了QPushButton类的setText()函数来设置按钮的显示文本,现在运行程序,效果如下图所示。 2.我们发现,在代码中来设置按钮的中文文本出现了乱码。这个可以有两种方法来解决,一个就是在编写程序时使用英文,当程序完成后使用Qt语言家来翻译整个软件中的显示字符串;还有一种方法就是在代码中设置字符串编码,然后使用函数对要在界面上显示的中文字符串进行编码转换。因为翻译一个软件很麻烦,对于这些小程序,我们希望中文可以立即显示出来,所以下面来讲解第二种方法。 3.设置字符串编码,可以使用QTextCodec类的setCodecForTr()函数,一般的使用方法就是在要进行编码转换之前调用该函数,下面我们在main.cpp文件中添加代码:

qt编写的小游戏

自己用qt动手写的小游戏,大家可以参考帮忙改进下,谢谢!! 游戏内容图片下坠,点击即可得分,未点击到则坠落到底则丢失,得分超过20则赢,丢失超过10则输 文件声音和图片为方便均采用绝对路径; 首先需要创建一个ui文件 文件名为hei.ui 里面拉2个label,一个为分数,一个为丢失数,objectname任意取 在拉2个lineedit,对应上面分别取objectivename为pointEdit和missEdit 在拉2个按钮开始游戏和退出游戏objectivename为startGame和quitGame 再依次创建下面文件,并使用下面代码: Hei.pro文件 SOURCES += \ main.cpp \ hei.cpp \ zujian.cpp \ gameArea.cpp FORMS += \ hei.ui HEADERS += \ hei.h \ zujian.h \ gameArea.h RESOURCES += \ image/ico.qrc RC_FILE=image/app.rc //定义运行图标不需要的话可以删掉 main.cpp 运行主文件 #include #include"hei.h" #include int main(int argc,char*argv[]) { QApplication app(argc,argv); QTextCodec::setCodecForTr(QTextCodec::codecForLocale());//使中文有效 heiw w; w.show(); return app.exec(); } gameArea.h 设置游戏区域背景类就是一个400*550的矩形框子,使用painter画笔画的,如果想丰富一点,可将该类换成QLabel继承类,然后贴图作为背景,还可以自动更换图片背景。 #ifndef GAMEAREA_H

QT编写一个简单的学生管理系统

嵌入式作业报告 ——学生信息管理系统

学生信息管理系统报告说明书 一.需求分析 利用QT Creator编程环境编写一个简单的学生信息管理系统,与数据库连接,或者直接对.txt文本进行操作,实现对学生信息的增,删,改,查功能。二.总体设计 在窗口刚跳出来时,在左边的QTextEdit对象中显示所有学生的信息,学生的信息被保存在student.txt文件中。右边是几个QPushButton,分别实现增,删,改,查功能。还有一个QLineEdit,用来编辑学生信息。 1.增加学生信息:在行编辑器内输入学生的信息,点击“增加”按钮,该生的信息就会被写入student.txt文件,并且将增加后的所有的学生信息显示在窗口的QTextEdit对象中。 2.删除学生信息:在行编辑器内输入学生的信息,点击“删除”按钮,该生的信息就会从student.txt文件中删除,并且将删除后的所有的学生信息显示在窗口的QTextEdit对象中。 3.修改学生信息:在行编辑器内输入学生的信息,点击“修改”按钮,该生的新的信息就会被写入文件,并且将修改后的所有的学生信息显示在窗口的QTextEdit对象中。 4.查找学生信息:在行编辑器内输入学生的学号,点击“查找”按钮,该生的信息会显示在窗口上。 三.详细设计 若选择直接对文本进行操作,过程比较麻烦。如在进行删除某位学生的信息时,很自然地会想到先找到该生在文件中的位置,再将其后的所有学生信息都向前移动,看起来似乎很简单,但是在文件里进行这些操作时还是要费一些功夫的。经过在网上查资料,得到了一种算法,就是先把文件里的每位学生的信息读出来,放到一个str[]数组中,再通过比较,找到要删除学生所在的数组元素的下标,之后仅仅是对数组内容进行更改,最后再将新的数组元素写入文件中,再通过读文件将信息显示在窗口。下面这段代码是我自己认为在这次作业中取得较

QT实现文本编辑器

一用Qt4实现的文本编辑器 1. 新建,打开,保存文件 2.基本的文本编辑功能(复制,粘贴,剪切等) 3.不同风格 4.改变文字的大小,颜色,字体等 界面如下: 二工程文件 1. /* src.pro*/ TEMPLATE = app CONFIG += warn_on \ thread \ qt \ qtestlib TARGET = texteditor DESTDIR = ../bin SOURCES += CMainWindow.cpp \ MainWindow.cpp \ CFindDialog.cpp

HEADERS += CFindDialog.h \ CMainWindow.h \ ui_finddialog.h \ ui_MainWindow.h FORMS += FindDialog.ui \ MainWindow.ui RESOURCES += MainWindow.qrc QT += qt3support 2. /*CMainWindow.cpp*/ #include "CMainWindow.h" #include "CFindDialog.h" #include #include CMainWindow::CMainWindow(QWidget *parent) : QMainWindow(parent) { setupUi(this); iniStatusBar(); iniConnect(); fontColorAct = new QAction(QPixmap(32, 32), tr("改变字体颜色"), this); styleToolBar = new QToolBar(this); styleToolBar->setObjectName(QString::fromUtf8("styleToolBar")); styleToolBar->setOrientation(Qt::Horizontal); this->addToolBar(Qt::TopToolBarArea, styleToolBar); menu_2->addAction(fontColorAct); styleToolBar->addAction(fontColorAct); show(); connect(fontColorAct, SIGNAL(triggered()), this, SLOT(changeColor())); } void CMainWindow::iniConnect() { connect(textEdit, SIGNAL(cursorPositionChanged()), this, SLOT(doCursorChanged())); connect(textEdit->document(), SIGNAL(contentsChanged()),

QT界面开发

1Qt4界面开发 1.1Q t历史 Qt是一个用于桌面系统和嵌入式开发的跨平台应用程序框架。它包括一个直观的API 和一个丰富的类库,以及用于GUI开发和国际化的集成工具,另外它支持Java?和C++开发。Qt让企业无须重新编写源代码,便可以构建运行在不同桌面操作系统和嵌入式设备上的软件应用程序。 Qt框架最早可公开获取是在1995年5月。最初是由Haavard Nord(TrollTech公司的首席执行官)和Eirik Chambe-Eng(TrollTech公司的董事会主席)。Haavard和Eirik 最早在特隆赫姆的挪威技术学院相遇,在那里他们双双获得了计算机科学硕士学位。 早在1991年,Haavard 就开始写一些最终成为Qt的类,并和 Eirik合力设计。在接下来的一年,Eirik提出了“信号和槽”的思想,一个现在已经被一些其他套装工具包含简单但功能强大的GUI编程范式。Haavard 接受了这一思想并手工生成了这一思想的代码实现。到1993年,Haavard和Eirik已经完成了Qt的第一个图形内核的开发并能用它来实现一些他们所需的物件。在这一年的年末,Haavard建议他们一起去经商,创建一个“世上最好的C++ GUI框架”。 字母“Q”被选为类的前缀是因为这个字母在Haavard的Emacs字体中看起来很漂亮。受到Xt(the X toolkit)的启发,字母“t”被追加来表示“toolkit”。公司在1994年5月4日成立,起初被命名为“Quasar Technologies”,之后被改名为“Troll Tech”,今天则被称为奇趣科技(Trolltech)。 1995年5月20日,Qt 0.90被上传到https://www.sodocs.net/doc/3016312383.html,。六天后,这一发布在comp.os.linux.announce被宣布。这是Qt的第一个公共发行版。Qt可以被用在Windows 和Unix开发中,在两个系统中提供相同的API。Qt从一开始就可以在两种许可协议下获取:一个是商业开发中需要的商业许可协议,一个用于开源开发的自由软件版。 1996年3月,欧洲航天局成为Qt的第一个客户,一下买了十个Qt商业许可。Qt 0.97在同年的5月底发布,1996年9月24日,Qt 1.0发布。到了同年年底,Qt到达了版本1.1;拥有8个客户,每一个都在不同的国家,他们购买了18个商业许可。 Qt 1.2 在1997年4月发布。Matthias Ettrich利用Qt构建KDE的决定帮助Qt成为Linux C++ GUI 开发的实际标准,1997年9月Qt 1.3发布。 1998年9月,Qt 1的最后一个主要发行版1.40发布。Qt 2.0于1999年7月发布。Qt 2有了一个新的开源许可协议,发布许可协议(QPL),遵守开源的定义。1999年8月,Qt赢得了LinuxWorld的“最佳开发库/工具”大奖。 2000年奇趣科技发布了Qtopia核心(后来成为Qt/Embedded)。它被设计用来运行在嵌入式Linux设备上并提供了自己的窗口系统作为X11的一个轻量级代替。现在Qt/X11和Qtopia核心都可以通过GNU通用许可(GPL)获取。到2000年年底,奇趣科技成立了Trolltech Inc.(USA)并且发布了Qtopia的第一个版本,一个移动电话和PDAs应用程序平台。Qtopia赢得了2001和2002年LinuxWorld的“最佳嵌入式 Linux 解决方案”大奖,

基于Qt5的闹钟实现代码

本程序基于QWidget实现,可以动态显示钟表,并且可以添加铃声 头文件widget.h代码如下: #ifndef WIDGET_H #define WIDGET_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); signals: void isCurrentTime(); private: Ui::Widget *ui; void init(); void layout(); void con();

QLCDNumber *lcdNumber; QLabel *label; QTimeEdit *timeEdit; QPushButton *button; QTimer *timer; QTimer *uptimer; QTimer *dtimer; QTimer *itimer; QRect rect; int x; int y; double du; QSystemTrayIcon *trayIcon; QAction *restoreAct; QAction *quitAct; QMenu *trayIconMenu; private slots: void clockChange(); void dialogUp(); void mini(); void down(); void comToCur(); protected: void closeEvent(QCloseEvent *e); }; #endif // WIDGET_H 源文件widget.cpp代码如下: #include "widget.h" #include "ui_widget.h" #include #include #include Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); init(); layout(); con();

基于Qt的TCPIP网络通信实现

基于tcp/ip网络通信的实现

摘要 如今随着计算机网络的不断发展,生活和工作环境的不断变化,以网络为重心的信息服务和通信服务受到各行各业的重视。而在当今各种聊天工具竟然日趋激烈的时代,在服务,技术等各个环节都做到更好的同时,如何把现代的网络应用技术与通信技术结合起来,让世界各地的人方便交流。 本课题的最终目的是基于Qt的TCP/IP协议的进行客户端和服务端之间进行聊天。本文中就该系统的设计思想、实现方法以及所采用的技术进行了系统的阐述,本文分为以下几个部分: 前言部分概括客户端和服务端之间通信的意义。 第一章介绍了课题实现的可行性研究。 第二章介绍了客户端和服务端具体通信的过程。 第三章是本文的核心部分,着重介绍和总结了本系统的实现思想、方法以及具体实现方案; 第四章对本聊天软件进行了总结和展望; 关键词:QT、tcp SOCKET、客户端服务端

第一章客户端与服务端通信的可行 性 1.1 课题的研究目标 本课题的最终目的是通过Qt Creator开发工具设计客户端和服务端的界面,进一步让客户端和服务端之间进行通信。 1.2 设计思路的分析和可行性 本如软件采用服务器和客户端的形式。服务器负责监听客户端和接收客户端发送过来的信息,并在显示在界面上。客户端则向服务端发送信息,在本地呈现的同时,通过网络实时发往服务器。用户在服务器器上也可以看见客户端发送的消息,并获取最新客户端发送的消息。 网络编程技术的成熟和界面设计技术使得客户端与服务端通信的设计成为可能,而且此软件同过设置IP是聊天通信更为方便。 1.3 开发环境和开发技术的选用 我们选用的开发环境是Qt Creator开发工具,Qt是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程式,也可用于开发非GUI程式,比如控制台工具和服务器。Qt是面向对象语言,易于扩展,并且允许组件编程。2008年,奇趣科技被诺基亚公司收购,QT也因此成为诺基亚旗下的编程语言

用QT实现桌面时钟设计.doc

附件二【学生用】 西北农林科技大学信息工程学院 面向对象实习实习报告 题目:桌面时钟设计与实现 学号 姓名 专业班级 指导教师 实践日期

目录 一、综合训练目的与要求 (1) 二、综合训练任务 (1) 三、总体设计 (2) 四、详细设计说明 (4) 五、调试与测试 (5) 六、实习日志 (9) 七、实习总结 (9) 八、附录:核心代码清单 (9)

一、综合训练目的与要求 正文这次面向对象实习实践活动是在C++面向对象程序设计之后进行的实践环节旨在加深对面向对象编程的设计思想(类的设计,抽象,封装,包含与继承,多态性,UML图)的理解,掌握使用C++编程的基本的技能,从而能通过小型的团队开发一些小软件的实现与设计,并能够解决一定的实际问题。以及掌握撰写规范程序设计文档的能力,还有训练语言组织与表达能力,提高综合能力。 二、综合训练任务 1、需求分析 随着科学技术的不断发展,计算机已经成为了我们日常工作生活和学习中不可缺少的工具,很多人每天都使用计算机与外界进行交互,为了让用户对计算机有更舒心的体验,桌面的个性化是必不可少,因此很有必要设计美观使用的桌面的小软件,来让计算机更加人性化,二当今社会是信息时代,生活节奏也随即加快,而一个美观的能提示显示时间和日历的小软件能让人们合理安排自己的行程,避免不必要的损失,因此桌面时钟有一定的需求性。 2、任务实现 (1)良好的人机交互界面是用户所亲睐的。 (2)使用QT Creater 来开发该界面程序。 (3)采用面向对象的思想实现时钟类、设置类的封装和与实现 (4)实现软件界面的布局 (5)为了实现不同类之间的联系提供类的接口。 (6)实现对代码的编写和调试工作,每天记录实习日志 (7)独立完成论文并进行答辩。

Qt学习:设计器Qt Designer实现(1)

分类:Windows平台 用设计器Qt Designer实现计算圆面积,完成下图所示的功能(布局图):当用户输入一个一个圆半径之后,可以显示计算后的圆的面积值 控件的属性设置如下: class text o bject QLabel 半径 radiusLabel 1.//dialog.h 2.#ifndef DIALOG_H 3.#define DIALOG_H 4. 5.#include 6. https://www.sodocs.net/doc/3016312383.html,space Ui { 8.class Dialog; 9.} 10. 11.class Dialog :public QDialog 12.{

13. Q_OBJECT //该宏的作用是启动Qt元对象系统的一些特性(比如支持信号和槽等) 14.//它必须放到类定义的私有区 15. 16.public: 17.explicit Dialog(QWidget *parent = 0); 18.~Dialog(); 19. 20.private slots: 21. void on_countBtn_2_clicked(); 22. 23.private: 24. Ui::Dialog *ui; 25.}; 26. 27.#endif // DIALOG_H 点击(此处)折叠或打开 1.//dialog.cpp 2.#include "dialog.h" 3.#include "ui_dialog.h" 4.#include 5. 6.const static double PI = 3.1416; 7. 8.Dialog::Dialog(QWidget *parent): 9. QDialog(parent), 10. ui(new Ui::Dialog) 11.{ 12. ui->setupUi(this); 13.} 14. 15.Dialog::~Dialog() 16.{ 17. delete ui; 18.} 19. 20.void Dialog::on_countBtn_2_clicked() 21.{ 22. bool OK; 23. QString tempStr; 24. QString valueStr = ui->radiusLineEdit->text(); 25.int valueInt = valueStr.toInt(&OK); 26. double area = valueInt * valueInt * PI;//计算圆面积 27. ui->areaLabel_2->setText(tempStr.setNum(area));

嵌入式Linux下用Qt Designer开发及实例

嵌入式Linux用Qt Designer快速开发 RAD(快速应用程序开发)是一种高效的软件开发形式,可以让用户在极短的时间里创建一个图形化的用户界面。通常情况下,在一张空白的表单上,开发人员可以通过拖拉或点击的方式,在窗口的适当位置上添加一些输入框和按钮等窗口组件。这时,RAD工具会自动编写和维护代码。而用户所要做的只是确定当点击按钮或选择选单选项时将要发生什么事件。 在Linux下,一个非常流行的RAD工具就是Qt Designer。它是嵌入式公司Trolltech 的Qt软件包的一个组成部分。如果用户使用的是KDE桌面,那么Qt已经自动安装上了,Qt Designer也很有可能已经被安装好。如果用户的系统没有安装,那么针对不同的版本,可以很方便地找到KDE Development Tools,并安装之。以Red Hat 9.0为例,用户可以从主选单→系统设置→添加/删除应用程序中选择KDE 软件开发,即可完成Qt Designer的安装(如图1所示)。 图1 安装Qt Designer 创建 为了快速地向大家展示一下Qt Designer功能,先创建一个简单的摄氏温度和华氏温度的转换程序。本文里将设计一个简单的GUI,并且添加一些简单的代码来实现温度的转换。因为是为了展示一下快速的开发过程,而不是一个严谨的软件项目的开发,所以这里不会进行任何的错误检查,也不进行输入检验(也就是检查用户的输入是否为合法的温度形式)、缓冲溢出检查等在日常软件开发中一定要做的步骤。

如果用户使用的是KDE,那么选单上应该已经有Qt Designer的图标。不同的发行版,图标的位置会有所不同。如果用户的发行版没有Qt Designer图标,那么可以在命令行模式下输入“designer”命令来启动该开发工具。在Red Hat 9.0中,可以通过点击主选单→编程→更多编程工具→Qt Designer来启动(如图2)。 图2 启动Qt Designer Qt Designer首先呈现给用户的是一个New/Open对话框(如图3所示)。因为这里要创建一个C++程序,所以在此选择C++ Project,点击“OK”继续。 图3 New/Open对话框 选择一个想要保存文件的位置,并且给出一个文件名,在此使用的文件名是cfconv。注意这里文件名的扩展名一定要是.pro。点击“Save”后,返回到了Project

Qt实现软件自动更新

前言 最近在学习Qt开发上位机,想实现一个检查更新的功能,网上搜索了 一大圈,发现实现过程都很复杂,关键是代码看不懂,所以就自己开发一种 简单的方式来实现。实现效果如下: 1.点击“检查更新”按钮,如果当前版本低于远程的版本,那么会弹出如下 窗口,提示更新,并显示远程的的版本号,更新时间,更新说明,如下图所示: 2.如果点击"去下载",那么会调用系统默认浏览器,直接创建下载任务。点击"不更新",则取消更新。 如果当前版本号和远程一致,那么会提示"已经是最新版本": 实现原理 首先在远程放置了一个文件,内容包含最新版软件的版本号、下载链接、更新时间、更新说明等,当用户点击"检查更新"时,会访问这个文件的地址,并对文件内容进行解析,得到最新的版本号、下载链接、更新时间、更新说 明等,如果版本号比当前软件的版本号高,那么弹出更新窗口。

我们先创建一个文本文件,可以是TXT格式、XML格式、JSON格式等等,因为之前学习过JSON的解析,所以这里我选择了JSON格式,当然选择其他格式也都是可以的。命名为 software_update.json,内容如下: 1.{ 2."PulseSensor": 3. { 4. "LatestVerison":"V1.1", 5. "Url":" //XXX. XXX. XXX /Demo_v1.1.exe", 6. "UpdateTime":"2019-03-31", 7. "ReleaseNote":"\n1.添加检查更新说明,包含版本号,下载链接,更 新时间,更新说明.\n2.优化“关于”界面" 8. }, 9."RGBContrl": 10. { 11. "LatestVerison":"V1.0", 12. "Url":" //***. ***.***/Demo_v1.1.exe", 13. "UpdateTime":"2019-03-30", 14. "ReleaseNote":"版本说明" 15. } 16.} 其中Url键值,是最新版软件的下载地址,然后把这个文件存放到服务器上,可以通过链接直接访问,如果有软件发布,只需要修改这个文件的内容:版本号、下载链接、更新说明、更新时间。当然,从文件内容也可以看出,支持多个软件的说明放在一起。 Qt端的实现 Qt端的实现,主要使用到了网络请求和JSON解析两个部分。 1.pro文件添加网络支持 1.# 网络请求 2.QT += network 2.添加头文件 1.//网络相关头文件 2.#include 3.#include 4.#include 5.//JSON相关头文件 6.#include 7.#include 8.#include 3.对象的定义和函数的声明 1.QNetworkAccessManager *manager; //定义网络请求对象 2.int parse_UpdateJSON(QString str); //解析数据函数的声明 3.void replyFinished(QNetworkReply *reply); //网络数据接收完成槽函数的声 明 4.QString CurVerison = "V1.1"; //定义当前软件的版本号 4.连接信号与槽 1.manager = new QNetworkAccessManager(this); //新建 QNetworkAccessManager对象

让Qt应用程序只运行一个实例 - 开源中国社区

首页 开源项目 Java 开源软件 C# 开源软件 PHP 开源软件 C/C++ 开源软件 Ruby 开源软件 Python 开源软件 Go开源软件 JS开源软件 问答 技术问答 ? 技术分享 ? IT大杂烩 ? 职业生涯 ? 站务/建议 ? 支付宝专区 ? MoPaaS专区 ? 开源硬件专区 ? 代码 博客 翻译 资讯 移动开发 Android开发专区 iOS开发专区 iOS代码库 Windows Phone 招聘 城市圈 你还没加入城市圈 全部城市圈xuyanghpu,您好 我的空间 站内留言 我的讨论记录 我分享的代码 我的博客 我关注的人 我的收藏夹 个人资料修改 更改我的头像 | 添加软件 | 投递新闻 | 退出开源中国 代码分享 当前位置:

分享到: 收藏 +15踩顶0[全屏查看所有代码]代码分享 ? C/C++ ? 图形界面开发/GUI/CGI 资讯、软件、分享、代码、搜 索 让Qt应用程序只运行一个实例 鉴客 发布于 2010年10月21日 17时, 2评/5284阅 在实际应用中,我们经常需要让应用程序只有一个实例,再打开新的文档或者页面时,只是替换现在的窗口或者新打开一个标签,而不是重新启动一次应用程序。Qt中是否可以做到这样呢,答案是肯定的,因为Qt本身可以直接调用系统API,肯定可以做到,但是我们希望找到一个跨平台的通用的解决方案。这就要用到Qt的QLocalSocket,QLocalServer类了,这两个类从接口上看和网络通信socket没有区别,但是它并不是真正的网络API,只是模仿了而已。这两个类在Unix/Linux系统上采用Unix域socket 实现,而在Windows上则采用有名管道(named pipe)来实现。 既然是网络API,那么思路就很简单了,应用程序启动时首先会去连一个服务器(这里通过应用程序的名字来标识,就像网络端口一样),如果连接失败,那么则自己是第一个实例,就创建这么一个服务器,否则将启动参数发送到服务器,然后自动退出,而服务器会在收到通知以后进行处理。 这些动作我想最好是放在创建Application实例后,因为Qt本身有很多操作没有Application实例是无法进行操作的(至少事件循环是在创立Application以后才能启动吧),因此最好的位置就是通过继承QApplicaiton或者QCoreApplication自定义一个YourOwnApplication,然后在构造函数中进行,下面是一个示意。 首先是YourOwnApplication构造函数: 标签: QApplicaiton QLocalSocket QLocalServer Qt 代码片段(1) 1. [代码]cpp代码 1234567891011121314151617Q S t r i n g s e r v e r N a m e = Q C o r e A p p l i c a t i o n ::a p p l i c a t i o n N a m e (); Q L o c a l S o c k e t s o c k e t ;s o c k e t .c o n n e c t T o S e r v e r (s e r v e r N a m e ); i f (s o c k e t .w a i t F o r C o n n e c t e d (500)) { //如果能够连接得上的话,将参数发送到服务器,然后退 Q T e x t S t r e a m s t r e a m (&s o c k e t ); Q S t r i n g L i s t a r g s = Q C o r e A p p l i c a t i o n ::a r g u m e n t s (); i f (a r g s .c o u n t () > 1) s t r e a m << a r g s .l a s t (); e l s e s t r e a m << Q S t r i n g (); s t r e a m .f l u s h (); s o c k e t .w a i t F o r B y t e s W r i t t e n (); q A p p ->q u i t (); ?

Qt界面美工实例

Qt StyleSheet样式表实例 在涉及到Qt 美工的时候首先需要掌握CSS 级联样式表。 下面将通过几个例子来介绍一下怎样使用Qt中的部件类型设计。自定义的前台背景与后台背景的颜色: 如果需要一个文本编辑器的背景变为黄色,下面是代码行: qApp->setStyleSheet("QLineEdit { background-color: yellow }"); 针对一个对话框的内容中使用QLineEdit以及QLineEdit的子类的背景都变成黄色,下面是代码: myDialog ->setStyleSheet("QLineEdit { background-color: yellow }"); 如果只需要制定一个QLineEdit的内容,将使用QObject::setObjectName() 下面是一个实例: myDialog->setStyleSheet("QLineEdit#nameEdit { background-color: yellow }"); 同时也可以针对每一个指定的部件做直接的类型设置,下面是一个实例: https://www.sodocs.net/doc/3016312383.html,Edit->setStyleSheet("background-color: yellow"); 为了做一个鲜明的对比,将要为文本设置合适的颜色。 nameEdit->setStyleSheet("color: blue; background-color: yellow"); 当然最好的办法还有针对选择的文本来进行设置,下面设置了一个选择文本的类型属性:nameEdit->setStyleSheet("color: blue;" "background-color: yellow;" "selection-color: yellow;" "selection-background-color: blue;"); 在有一些情况下,不需要用户参与,而有软件设计人员来自己制定样式,即使这些是有违审美角度。下面就从应用程序开发角度来设计样式。 *[mandatoryField="true"] { background-color: yellow } 上面的意思是一些强制的区域是需要用Qt 的属性管理来强制设置成为黄色的背景。 这样一些强制的部件,将需要通过函数来设置当前的属性已经被强制设置,下面是实现的代码:

用qt实现类似qq截图的工具代码

[文件] ShotPixmap20110227.rar ~ 6KB 下载(385) [代码] widget.cpp #include"widget.h" #include"ui_widget.h" #include Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); createWidgets(); createConnects(); createEventFilter(); } Widget::~Widget() { delete ui; delete quit; delete mini; delete restore; delete menu; delete trayIcon; delete fullScreenLabel; delete shotScreenLabel; } bool Widget::eventFilter(QObject *o, QEvent *e) { if (o != fullScreenLabel) { return Widget::eventFilter(o, e); } QMouseEvent *mouseEvent = static_cast (e); //true 鼠标左键按下且按键还未弹起 if ((mouseEvent->button() == Qt::LeftButton) && (mouseEvent->type() == QEvent::MouseButtonPress)) { //鼠标左键标志位按下

相关主题