关闭
关闭
首页 > 嵌入式软件 > QT

1、如果在窗体关闭前自行判断是否可关闭

答:重新实现这个窗体的closeEvent()函数,加入判断操作

Quote:

void MainWindow::closeEvent(QCloseEvent *event)

{

if (maybeSave())

{

writeSettings();

event->accept();

}

else

{

event->ignore();

}

}

2、如何用打开和保存文件对话

答:使用QFileDialog

Quote:

QString fileName = QFileDialog::getOpenFileName(this);

if (!fileName.isEmpty())

{

loadFile(fileName);

}

Quote:

QString fileName = QFileDialog::getSaveFileName(this);

if (fileName.isEmpty())

{

return false;

}

3、如果创建Actions(可在菜单和工具栏里使用这些Action)

答:

Quote:

newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);

newAct->setShortcut(tr("Ctrl+N"));

newAct->setStatusTip(tr("Create a new file"));

connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));

openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this);

openAct->setShortcut(tr("Ctrl+O"));

openAct->setStatusTip(tr("Open an existing file"));

connect(openAct, SIGNAL(triggered()), this, SLOT(open()));

saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this);

saveAct->setShortcut(tr("Ctrl+S"));

saveAct->setStatusTip(tr("Save the document to disk"));

connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));

saveAsAct = new QAction(tr("Save &As..."), this);

saveAsAct->setStatusTip(tr("Save the document under a new name"));

connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));

exitAct = new QAction(tr("E&xit"), this);

exitAct->setShortcut(tr("Ctrl+Q"));

exitAct->setStatusTip(tr("Exit the application"));

connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));

cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);

cutAct->setShortcut(tr("Ctrl+X"));

cutAct->setStatusTip(tr("Cut the current selection's contents to the "

"clipboard"));

connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));

copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this);

copyAct->setShortcut(tr("Ctrl+C"));

copyAct->setStatusTip(tr("Copy the current selection's contents to the "

"clipboard"));

connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));

pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this);

pasteAct->setShortcut(tr("Ctrl+V"));

pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current "

"selection"));

connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));

aboutAct = new QAction(tr("&About"), this);

aboutAct->setStatusTip(tr("Show the application's About box"));

connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

aboutQtAct = new QAction(tr("About &Qt"), this);

aboutQtAct->setStatusTip(tr("Show the Qt library's About box"));

connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));

4、如果创建主菜单

答:采用上面的QAction的帮助,创建主菜单

Quote:

fileMenu = menuBar()->addMenu(tr("&File"));

fileMenu->addAction(newAct);

fileMenu->addAction(openAct);

fileMenu->addAction(saveAct);

fileMenu->addAction(saveAsAct);

fileMenu->addSeparator();

fileMenu->addAction(exitAct);

editMenu = menuBar()->addMenu(tr("&Edit"));

editMenu->addAction(cutAct);

editMenu->addAction(copyAct);

editMenu->addAction(pasteAct);

menuBar()->addSeparator();

helpMenu = menuBar()->addMenu(tr("&Help"));

helpMenu->addAction(aboutAct);

helpMenu->addAction(aboutQtAct);

5、如果创建工具栏

答:采用上面的QAction的帮助,创建工具栏

Quote:

fileToolBar = addToolBar(tr("File"));

fileToolBar->addAction(newAct);

fileToolBar->addAction(openAct);

fileToolBar->addAction(saveAct);

editToolBar = addToolBar(tr("Edit"));

editToolBar->addAction(cutAct);

editToolBar->addAction(copyAct);

editToolBar->addAction(pasteAct);

6、如何使用配置文件保存配置

答:使用QSettings类

Quote:

QSettings settings("Trolltech", "Application Example");

QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();

QSize size = settings.value("size", QSize(400, 400)).toSize();

Quote:

QSettings settings("Trolltech", "Application Example");

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

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

7、如何使用警告、信息等对话框

答:使用QMessageBox类的静态方法

Quote:

int ret = QMessageBox::warning(this, tr("Application"),

tr("The document has been modified.\n"

"Do you want to save your changes?"),

QMessageBox::Yes | QMessageBox::Default,

QMessageBox::No,

QMessageBox::Cancel | QMessageBox::Escape);

if (ret == QMessageBox::Yes)

return save();

else if (ret == QMessageBox::Cancel)

return false;

8、如何使通用对话框中文化

答:对话框的中文化

比 如说,QColorDialog的与文字相关的部分,主要在qcolordialog.cpp文件中,我们可以从qcolordialog.cpp用 lupdate生成一个ts文件,然后用自定义这个ts文件的翻译,再用lrelease生成一个.qm文件,当然了,主程序就要改变要支持多国语言了, 使用这个.qm文件就可以了。

另外,还有一个更快的方法,在源代码解开后有一个目录translations,下面有一些.ts, .qm文件,我们拷贝一个:

Quote:

cp src/translations/qt_untranslated.ts ./qt_zh_CN.ts

然 后,我们就用Linguist打开这个qt_zh_CN.ts,进行翻译了,翻译完成后,保存后,再用lrelease命令生成qt_zh_CN.qm, 这样,我们把它加入到我们的qt project中,那些系统的对话框,菜单等等其它的默认是英文的东西就能显示成中文了。

9、在Windows下Qt里为什么没有终端输出?

答:把下面的配置项加入到.pro文件中

Quote:

win32:CONFIG += console

10、Qt 4 for X11 OpenSource版如何静态链接?

答:编译安装的时候加上-static选项

Quote:

./configure -static //一定要加static选项

gmake

gmake install

然后,在Makefile文件中加 static 选项或者在.pro文件中加上QMAKE_LFLAGS += -static,就可以连接静态库了。

11、想在源代码中直接使用中文,而不使用tr()函数进行转换,怎么办?

答:在main函数中加入下面三条语句,但并不提倡

Quote:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));

QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

或者

Quote:

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));

QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));

使用GBK还是使用UTF-8,依源文件中汉字使用的内码而定

这样,就可在源文件中直接使用中文,比如:

Quote:

QMessageBox::information(NULL, "信息", "关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons);

12、为什么将开发的使用数据库的程序发布到其它机器就连接不上数据库?

答:这是由于程序找不到数据库插件而致,可照如下解决方法:

在main函数中加入下面语句:

Quote:

QApplication::addLibraryPath(strPluginsPath");

strPluginsPath是插件所在目录,比如此目录为/myapplication/plugins

则将需要的sql驱动,比如qsqlmysql.dll, qsqlodbc.dll或对应的.so文件放到

/myapplication/plugins/sqldrivers/

目录下面就行了

这是一种解决方法,还有一种通用的解决方法,即在可执行文件目录下写qt.conf文件,把系统相关的一些目录配置写到qt.conf文件里,详细情况情参考Qt Document Reference里的qt.conf部分

13、如何创建QT使用的DLL(.so)以及如何使用此DLL(.so)

答:创建DLL时其工程使用lib模板

Quote:

TEMPLATE=lib

而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它程序使用此DLL时需要此头文件

在使用此DLL时,则在此工程源文件中引入DLL头文件,并在.pro文件中加入下面配置项:

Quote:

LIBS += -Lyourdlllibpath -lyourdlllibname

Windows下和Linux下同样(Windows下生成的DLL文件名为yourdlllibname.dll而在Linux下生成的为libyourdlllibname.so。注意,关于DLL程序的写法,遵从各平台级编译器所定的规则。

14、如何启动一个外部程序

答:1、使用QProcess::startDetached()方法,启动外部程序后立即返回;

2、使用QProcess::execute(),不过使用此方法时程序会最阻塞直到此方法执行的程序结束后返回,这时候可使用QProcess和QThread这两个类结合使用的方法来处理,以防止在主线程中调用而导致阻塞的情况

先从QThread继承一个类,重新实现run()函数:

Quote:

class MyThread : public QThread

{

public:

void run();

};

void MyThread::run()

{

QProcess::execute("notepad.exe");

}

这样,在使用的时候则可定义一个MyThread类型的成员变量,使用时调用其start()方法:

Quote:

class ...............

{...........

MyThread thread;

............

};

.....................

thread.start();

15、如何打印报表

答:Qt 目前对报表打印支持的库还很少,不过有种变通的方法,就是使用XML+XSLT+XSL-FO来进行报表设计,XML输出数据,用XSLT将XML数据转 换为XSL-FO格式的报表,由于现在的浏览器不直接支持XSL-FO格式的显示,所以暂时可用工具(Apache FOP, Java做的)将XSL-FO转换为PDF文档来进行打印,转换和打印由FOP来做,生成XSL-FO格式的报表可以由Qt来生成,也可以由其它内容转换 过来,比如有工具(html2fo)将HTML转换为XSL-FO。

16、如何在系统托盘区显示图标

答:在4.2及其以上版本中使用QSystemTrayIcon类来实现

17、怎样将日志输出到文件中

答:(myer提供)

Quote:

void myMessageOutput( QtMsgType type, const char *msg )

{

switch ( type ) {

case QtDebugMsg:

//写入文件;

break;

case QtWarningMsg:

break;

case QtFatalMsg:

abort();

}

}

int main( int argc, char** argv )

{

QApplication app( argc, argv );

qInstallMsgHandler( myMessageOutput );

......

return app.exec();

}

qDebug(), qWarning(), qFatal()分别对应以上三种type。

18、如何将图像编译到可执行程序中去

答:使用.qrc文件

写.qrc文件,例如:

res.qrc

Quote:

images/copy.png

images/cut.png

images/new.png

images/open.png

images/paste.png

images/save.png

然后在.pro中加入下面代码:

Quote:

RESOURCES = res.qrc

在程序中使用:

Quote:

...

:images/copy.png

...

19、如何制作不规则形状的窗体或部件

答:请参考下面的帖子

http://www.qtcn.org/bbs/read.php?tid=8681

20、删除数据库时出现"QSqlDatabasePrivate::removeDatabase: connection 'xxxx' is still in use, all queries will cease to work"该如何处理

答:出现此种错误是因为使用了连接名字为xxxx的变量作用域没有结束,解决方法是在所有使用了xxxx连接的数据库组件变量的作用域都结束后再使用QSqlDatabase::removeDatabae("xxxx")来删除连接。

21、如何显示一个图片并使其随窗体同步缩放

答:下面给出一个从QWidget派生的类ImageWidget,来设置其背景为一个图片,并可随着窗体改变而改变,其实从下面的代码中可以引申出其它许多方法,如果需要的话,可以从这个类再派生出其它类来使用。

头文件: ImageWidget.hpp

Quote:

#ifndef IMAGEWIDGET_HPP

#define IMAGEWIDGET_HPP

#include

#include

class ImageWidget : public QWidget

{

Q_OBJECT

public:

ImageWidget(QWidget *parent = 0, Qt::WindowFlags f = 0);

virtual ~ImageWidget();

protected:

void resizeEvent(QResizeEvent *event);

private:

QImage _image;

};

#endif

CPP文件: ImageWidget.cpp

Quote:

#include "ImageWidget.hpp"

ImageWidget::ImageWidget(QWidget *parent, Qt::WindowFlags f)

: QWidget(parent, f)

{

_image.load("image/image_background");

setAutoFillBackground(true); // 这个属性一定要设置

QPalette pal(palette());

pal.setBrush(QPalette::Window,

QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio,

Qt::SmoothTransformation)));

setPalette(pal);

}

ImageWidget::~ImageWidget()

{

}

// 随着窗体变化而设置背景

void ImageWidget::resizeEvent(QResizeEvent *event)

{

QWidget::resizeEvent(event);

QPalette pal(palette());

pal.setBrush(QPalette::Window,

QBrush(_image.scaled(event->size(), Qt::IgnoreAspectRatio,

Qt::SmoothTransformation)));

setPalette(pal);

}

22、Windows下如何读串口信息

答:可通过注册表来读qt4.1.0 读取注册表得到 串口信息的方法!

换一批

延伸阅读

[行业资讯] 三星将扩产 DRAM产量将暴涨

三星将扩产 DRAM产量将暴涨

三星电子准备按下毁灭开关,内存的超级周期将画上句点? 据传三星为了防止陆厂染指DRAM,打算大举扩产,未来全球DRAM产出可能一举暴增20%。 ......

关键字:三星 DRAM

[行业资讯] 苹果或将采用英特尔芯片,放弃高通?

苹果或将采用英特尔芯片,放弃高通?

据报道,苹果欲在未来iPhone和iPad设计中,放弃高通零芯片转用英特尔芯片。作为无线标准最大芯片供应商,高通对于专利保护提升到了极点,其专利使用费更是贵的离谱。对于这种费用众多手机厂商也都是“敢怒不敢言”,而手机中行业霸主苹果公司却有些......

关键字:苹果 英特尔 调制解调器芯片

[行业资讯] 物联网(IoT)的未来可能取决于售价不到50美分的芯片?

物联网(IoT)的未来可能取决于售价不到50美分的芯片?

物联网(IoT)需要售价不到50美分的芯片才有机会放量?但如何让搭配新型存储器、连接性与传感器的IoT SoC降低成本与功耗,以及扩展所需要的规模仍有待进一步探索… ......

关键字:SoC 物联网 芯片

[行业资讯] 联芸科技亮相第十六届中国国际社会公共安全博览会助力安防存储

联芸科技亮相第十六届中国国际社会公共安全博览会助力安防存储

2017年 10 月 29 日- 11月1日,第十六届中国国际社会公共安全博览会在深圳如期隆重举办。联芸科技作为国内最为成熟的国产SSD固态硬盘主控芯片及SSD固态硬盘全解决方案提供商,连续两届亮相中国国际社会公共安全博览会。 ......

关键字:联芸科技 SSD 主控芯片

[行业资讯] AWS推出采用NVIDIA最新技术的AI云服务

AWS推出采用NVIDIA最新技术的AI云服务

AWS今天公布了一系列AI优化的实例,号称这是市场上最强大的实例,旨在吸引更多企业在AWS云平台上运行人工智能项目。 ......

关键字:AWS AI云服务 NVIDIA

[新鲜事] 3D打印镜头 让机器人获得老鹰和人类视力

3D打印镜头 让机器人获得老鹰和人类视力

在许多方面,人眼不像数码相机。我们的眼睛没有固定的帧速率或分辨率;没有一致的颜色再现,甚至具有盲点,这些光学不一致性是自然选择的产物,并且为科学家提供了一些好处,可以用在数字视觉中。......

关键字:3D打印 镜头 视力

[破谣言] 校园贷虚假宣传:宣称月息0.99% 实际年息高达40%

校园贷虚假宣传:宣称月息0.99% 实际年息高达40%

“宣称月息0.99%,很可能就是个坑,实际年化利率可能达到40%,已经是高利贷了”。......

关键字:校园贷 借贷

[新鲜事] 工程师睡着了?福特汽车决定将跳过Level 3 转向完全自动驾驶

工程师睡着了?福特汽车决定将跳过Level 3 转向完全自动驾驶

福特汽车将跳过 Level 3 ,直接转向 Level 4 完全自动驾驶,原因是它的工程师在 Level 3 测试时睡着了。......

关键字:福特 自动驾驶

[猎聘集] 为什么在中国电子工程师的发展明显不如软件工程师方向?

为什么在中国电子工程师的发展明显不如软件工程师方向?

做了9年硬件电路设计,5年智能手机,4年医疗器械,看到这个问题,心情很复杂,自己喜爱的工作居然无奈的发展到了这个窘境。......

关键字:电子工程师 软件工程师
条评论

我 要 评 论

网友评论

大家都爱看

  • 华为的优势,就是自家的各种自研芯片

    CPU即中央处理器,是一块超大规模的集成电路,是一台计算机的运算核心和控制核心。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

    2017-08-16
  • 你不知道Ryzen芯片有多火?来看看AMD的股票吧

    据外媒报道,美银美林认为,AMD最新的Ryzen芯片可能会引发一波销售浪潮,进而推动该股继续上涨。它认为AMD股票还有40%以上的上涨空间。

    2017-08-16
  • 国产芯片:厚积薄发,强势崛起

    关于国产芯片,是近几年才有崛起的势头,可是在几年之前,国产芯片还处于“沉睡”的状态,尤其是手机芯片,几乎大部分都依赖进口,而且国外的市场几乎被高通和联发科所垄断,也就展讯还在市场边…

    2017-08-16
  • 为了数据安全 大疆无人机增加隐私飞行功能

    大疆周一表示,在美国陆军因为“网络缺陷”而要求其成员停用大疆无人机后,这家中国无人机制造商将加强无人机的数据安全性。 大疆政策和法务副总裁布伦丹&middot…

    2017-08-15
  • Intel代工 展讯发布14nm SC9853I手机SoC

    SC9853I采用的Intel的14nm FinFET制程,架构为8核64位Airmont架构,主频1.8GHz,GPU为Mali-T820 MP2,号称面向799~1299元档次的手机。…

    2017-08-15