常见的几个Qt编程问题的处理


1、如何在窗体关闭前自行判断是否可关闭
答:重新实现这个窗体的closeEvent()函数,加入判断操作
常见的几个Qt编程问题的处理void MainWindow::closeEvent(QCloseEvent *event)
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理       
if (maybeSave())
常见的几个Qt编程问题的处理       
{
常见的几个Qt编程问题的处理              writeSettings();
常见的几个Qt编程问题的处理              
event->accept();
常见的几个Qt编程问题的处理       }

常见的几个Qt编程问题的处理       
else
常见的几个Qt编程问题的处理       
{
常见的几个Qt编程问题的处理              
event->ignore();
常见的几个Qt编程问题的处理       }

常见的几个Qt编程问题的处理}


2、如何用打开和保存文件对话
答:使用QFileDialog
打开文件
常见的几个Qt编程问题的处理             QString fileName = QFileDialog::getOpenFileName(this);
常见的几个Qt编程问题的处理              
if (!fileName.isEmpty())
常见的几个Qt编程问题的处理              
{
常见的几个Qt编程问题的处理                     loadFile(fileName);
常见的几个Qt编程问题的处理              }
保存文件
常见的几个Qt编程问题的处理       QString fileName = QFileDialog::getSaveFileName(this);
常见的几个Qt编程问题的处理       
if (fileName.isEmpty())
常见的几个Qt编程问题的处理       
{
常见的几个Qt编程问题的处理              
return false;
常见的几个Qt编程问题的处理       }


3、如何创建Actions(可在菜单和工具栏里使用这些Action)
答:
常见的几个Qt编程问题的处理newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this);
常见的几个Qt编程问题的处理        newAct
->setShortcut(tr("Ctrl+N"));
常见的几个Qt编程问题的处理        newAct
->setStatusTip(tr("Create a new file"));
常见的几个Qt编程问题的处理        connect(newAct, SIGNAL(triggered()), 
this, SLOT(newFile()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        openAct 
= new QAction(QIcon(":/images/open.png"), tr("&Open常见的几个Qt编程问题的处理"), this);
常见的几个Qt编程问题的处理        openAct
->setShortcut(tr("Ctrl+O"));
常见的几个Qt编程问题的处理        openAct
->setStatusTip(tr("Open an existing file"));
常见的几个Qt编程问题的处理        connect(openAct, SIGNAL(triggered()), 
this, SLOT(open()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        saveAct 
= new QAction(QIcon(":/images/save.png"), tr("&Save"), this);
常见的几个Qt编程问题的处理        saveAct
->setShortcut(tr("Ctrl+S"));
常见的几个Qt编程问题的处理        saveAct
->setStatusTip(tr("Save the document to disk"));
常见的几个Qt编程问题的处理        connect(saveAct, SIGNAL(triggered()), 
this, SLOT(save()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        saveAsAct 
= new QAction(tr("Save &As常见的几个Qt编程问题的处理"), this);
常见的几个Qt编程问题的处理        saveAsAct
->setStatusTip(tr("Save the document under a new name"));
常见的几个Qt编程问题的处理        connect(saveAsAct, SIGNAL(triggered()), 
this, SLOT(saveAs()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        exitAct 
= new QAction(tr("E&xit"), this);
常见的几个Qt编程问题的处理        exitAct
->setShortcut(tr("Ctrl+Q"));
常见的几个Qt编程问题的处理        exitAct
->setStatusTip(tr("Exit the application"));
常见的几个Qt编程问题的处理        connect(exitAct, SIGNAL(triggered()), 
this, SLOT(close()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        cutAct 
= new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this);
常见的几个Qt编程问题的处理        cutAct
->setShortcut(tr("Ctrl+X"));
常见的几个Qt编程问题的处理        cutAct
->setStatusTip(tr("Cut the current selection's contents to the "
常见的几个Qt编程问题的处理                                
"clipboard"));
常见的几个Qt编程问题的处理        connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        copyAct 
= new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this);
常见的几个Qt编程问题的处理        copyAct
->setShortcut(tr("Ctrl+C"));
常见的几个Qt编程问题的处理        copyAct
->setStatusTip(tr("Copy the current selection's contents to the "
常见的几个Qt编程问题的处理                                 
"clipboard"));
常见的几个Qt编程问题的处理        connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        pasteAct 
= new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this);
常见的几个Qt编程问题的处理        pasteAct
->setShortcut(tr("Ctrl+V"));
常见的几个Qt编程问题的处理        pasteAct
->setStatusTip(tr("Paste the clipboard's contents into the current "
常见的几个Qt编程问题的处理                                  
"selection"));
常见的几个Qt编程问题的处理        connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        aboutAct 
= new QAction(tr("&About"), this);
常见的几个Qt编程问题的处理        aboutAct
->setStatusTip(tr("Show the application's About box"));
常见的几个Qt编程问题的处理        connect(aboutAct, SIGNAL(triggered()), 
this, SLOT(about()));
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        aboutQtAct 
= new QAction(tr("About &Qt"), this);
常见的几个Qt编程问题的处理        aboutQtAct
->setStatusTip(tr("Show the Qt library's About box"));
常见的几个Qt编程问题的处理        connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));
常见的几个Qt编程问题的处理


4、如何创建主菜单
答:采用上面的QAction的帮助,创建主菜单
常见的几个Qt编程问题的处理 fileMenu = menuBar()->addMenu(tr("&File"));
常见的几个Qt编程问题的处理        fileMenu
->addAction(newAct);
常见的几个Qt编程问题的处理        fileMenu
->addAction(openAct);
常见的几个Qt编程问题的处理        fileMenu
->addAction(saveAct);
常见的几个Qt编程问题的处理        fileMenu
->addAction(saveAsAct);
常见的几个Qt编程问题的处理        fileMenu
->addSeparator();
常见的几个Qt编程问题的处理        fileMenu
->addAction(exitAct);
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        editMenu 
= menuBar()->addMenu(tr("&Edit"));
常见的几个Qt编程问题的处理        editMenu
->addAction(cutAct);
常见的几个Qt编程问题的处理        editMenu
->addAction(copyAct);
常见的几个Qt编程问题的处理        editMenu
->addAction(pasteAct);
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        menuBar()
->addSeparator();
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理        helpMenu 
= menuBar()->addMenu(tr("&Help"));
常见的几个Qt编程问题的处理        helpMenu
->addAction(aboutAct);
常见的几个Qt编程问题的处理        helpMenu
->addAction(aboutQtAct);
常见的几个Qt编程问题的处理


5、如何创建工具栏
答:采用上面的QAction的帮助,创建工具栏
常见的几个Qt编程问题的处理fileToolBar = addToolBar(tr("File"));
常见的几个Qt编程问题的处理fileToolBar
->addAction(newAct);
常见的几个Qt编程问题的处理fileToolBar
->addAction(openAct);
常见的几个Qt编程问题的处理fileToolBar
->addAction(saveAct);
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理editToolBar 
= addToolBar(tr("Edit"));
常见的几个Qt编程问题的处理editToolBar
->addAction(cutAct);
常见的几个Qt编程问题的处理editToolBar
->addAction(copyAct);
常见的几个Qt编程问题的处理editToolBar
->addAction(pasteAct);
常见的几个Qt编程问题的处理


6、如何使用配置文件保存配置
答:使用QSettings类
常见的几个Qt编程问题的处理QSettings settings("Trolltech""Application Example");
常见的几个Qt编程问题的处理QPoint pos 
= settings.value("pos", QPoint(200200)).toPoint();
常见的几个Qt编程问题的处理QSize size 
= settings.value("size", QSize(400400)).toSize();

常见的几个Qt编程问题的处理QSettings settings("Trolltech""Application Example");
常见的几个Qt编程问题的处理settings.setValue(
"pos", pos());
常见的几个Qt编程问题的处理settings.setValue(
"size", size());


7、如何使用警告、信息等对话框
答:使用QMessageBox类的静态方法
常见的几个Qt编程问题的处理int ret = QMessageBox::warning(this, tr("Application"),
常见的几个Qt编程问题的处理                         tr(
"The document has been modified.\n"
常见的几个Qt编程问题的处理                            
"Do you want to save your changes?"),
常见的几个Qt编程问题的处理                         QMessageBox::Yes 
| QMessageBox::Default,
常见的几个Qt编程问题的处理                         QMessageBox::No,
常见的几个Qt编程问题的处理                         QMessageBox::Cancel 
| QMessageBox::Escape);
常见的几个Qt编程问题的处理            
if (ret == QMessageBox::Yes)
常见的几个Qt编程问题的处理                
return save();
常见的几个Qt编程问题的处理            
else if (ret == QMessageBox::Cancel)
常见的几个Qt编程问题的处理                
return false;
常见的几个Qt编程问题的处理


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

另外,还有一个更快的方法,在源代码解开后有一个目录translations,下面有一些.ts, .qm文件,我们拷贝一个:
常见的几个Qt编程问题的处理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文件中
常见的几个Qt编程问题的处理win32:CONFIG += console


10、Qt 4 for X11 OpenSource版如何静态链接?
答:编译安装的时候加上-static选项

 

常见的几个Qt编程问题的处理./configure -static   //一定要加static选项
常见的几个Qt编程问题的处理gmake
常见的几个Qt编程问题的处理gmake install


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


11、想在源代码中直接使用中文,而不使用tr()函数进行转换,怎么办?
答:在main函数中加入下面三条语句,但并不提倡

常见的几个Qt编程问题的处理QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
常见的几个Qt编程问题的处理QTextCodec::setCodecForCStrings(QTextCodec::codecForName(
"UTF-8"));
常见的几个Qt编程问题的处理QTextCodec::setCodecForTr(QTextCodec::codecForName(
"UTF-8"));

或者

常见的几个Qt编程问题的处理QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
常见的几个Qt编程问题的处理QTextCodec::setCodecForCStrings(QTextCodec::codecForName(
"GBK"));
常见的几个Qt编程问题的处理QTextCodec::setCodecForTr(QTextCodec::codecForName(
"GBK"));

使用GBK还是使用UTF-8,依源文件中汉字使用的内码而定
这样,就可在源文件中直接使用中文,比如:
常见的几个Qt编程问题的处理QMessageBox::information(NULL, "信息""关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons);
常见的几个Qt编程问题的处理



12、为什么将开发的使用数据库的程序发布到其它机器就连接不上数据库?
答:这是由于程序找不到数据库插件而致,可照如下解决方法:
在main函数中加入下面语句:

常见的几个Qt编程问题的处理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模板

常见的几个Qt编程问题的处理TEMPLATE=lib

而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它程序使用此DLL时需要此头文件
在使用此DLL时,则在此工程源文件中引入DLL头文件,并在.pro文件中加入下面配置项:

 

常见的几个Qt编程问题的处理LIBS += -Lyourdlllibpath -lyourdlllibname


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


14、如何启动一个外部程序
答:
1、使用QProcess::startDetached()方法,启动外部程序后立即返回;
2、使用QProcess::execute(),不过使用此方法时程序会最阻塞直到此方法执行的程序结束后返回,这时候可使用QProcess和QThread这两个类结合使用的方法来处理,以防止在主线程中调用而导致阻塞的情况
先从QThread继承一个类,重新实现run()函数:

常见的几个Qt编程问题的处理class MyThread : public QThread
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理
public:
常见的几个Qt编程问题的处理     
void run();
常见的几个Qt编程问题的处理}
;
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理
void MyThread::run()
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理    QProcess::execute(
"notepad.exe");
常见的几个Qt编程问题的处理}


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

常见的几个Qt编程问题的处理class 常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理
{常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理..
常见的几个Qt编程问题的处理MyThread thread;
常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理}
;
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理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提供)
常见的几个Qt编程问题的处理void myMessageOutput( QtMsgType type, const char *msg )
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理    
switch ( type ) {
常见的几个Qt编程问题的处理        
case QtDebugMsg:
常见的几个Qt编程问题的处理            
//写入文件;
常见的几个Qt编程问题的处理
            break;
常见的几个Qt编程问题的处理        
case QtWarningMsg:
常见的几个Qt编程问题的处理            
break;
常见的几个Qt编程问题的处理        
case QtFatalMsg:
常见的几个Qt编程问题的处理            abort();
常见的几个Qt编程问题的处理    }

常见的几个Qt编程问题的处理}

常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理
int main( int argc, char** argv )
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理    QApplication app( argc, argv );
常见的几个Qt编程问题的处理    qInstallMsgHandler( myMessageOutput );
常见的几个Qt编程问题的处理    常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理    
return app.exec();
常见的几个Qt编程问题的处理}

常见的几个Qt编程问题的处理

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


18、如何将图像编译到可执行程序中去
答:使用.qrc文件
写.qrc文件,例如:
res.qrc
常见的几个Qt编程问题的处理<!DOCTYPE RCC><RCC version="1.0">
常见的几个Qt编程问题的处理
<qresource>
常见的几个Qt编程问题的处理     
<file>images/copy.png</file>
常见的几个Qt编程问题的处理     
<file>images/cut.png</file>
常见的几个Qt编程问题的处理     
<file>images/new.png</file>
常见的几个Qt编程问题的处理     
<file>images/open.png</file>
常见的几个Qt编程问题的处理     
<file>images/paste.png</file>
常见的几个Qt编程问题的处理     
<file>images/save.png</file>
常见的几个Qt编程问题的处理
</qresource>
常见的几个Qt编程问题的处理
</RCC>

然后在.pro中加入下面代码:
常见的几个Qt编程问题的处理RESOURCES     = res.qrc

在程序中使用:
常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理:images
/copy.png
常见的几个Qt编程问题的处理常见的几个Qt编程问题的处理


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
常见的几个Qt编程问题的处理#ifndef IMAGEWIDGET_HPP
常见的几个Qt编程问题的处理
#define IMAGEWIDGET_HPP
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理#include 
<QtCore>
常见的几个Qt编程问题的处理#include 
<QtGui>
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理
class ImageWidget : public QWidget
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理    Q_OBJECT
常见的几个Qt编程问题的处理
public:
常见的几个Qt编程问题的处理    ImageWidget(QWidget 
*parent = 0, Qt::WindowFlags f = 0);
常见的几个Qt编程问题的处理    
virtual ~ImageWidget();
常见的几个Qt编程问题的处理
protected:
常见的几个Qt编程问题的处理    
void resizeEvent(QResizeEvent *event);
常见的几个Qt编程问题的处理
private:
常见的几个Qt编程问题的处理    QImage _image;
常见的几个Qt编程问题的处理}
;
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理
#endif
常见的几个Qt编程问题的处理

CPP文件: ImageWidget.cpp
常见的几个Qt编程问题的处理#include "ImageWidget.hpp"
常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理ImageWidget::ImageWidget(QWidget 
*parent, Qt::WindowFlags f)
常见的几个Qt编程问题的处理    : QWidget(parent, f)
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理    _image.load(
"image/image_background");
常见的几个Qt编程问题的处理    setAutoFillBackground(
true);   // 这个属性一定要设置
常见的几个Qt编程问题的处理
    QPalette pal(palette());
常见的几个Qt编程问题的处理    pal.setBrush(QPalette::Window, 
常见的几个Qt编程问题的处理                QBrush(_image.scaled(size(), Qt::IgnoreAspectRatio, 
常见的几个Qt编程问题的处理                        Qt::SmoothTransformation)));
常见的几个Qt编程问题的处理    setPalette(pal);
常见的几个Qt编程问题的处理}

常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理ImageWidget::
~ImageWidget()
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理}

常见的几个Qt编程问题的处理
常见的几个Qt编程问题的处理
// 随着窗体变化而设置背景
常见的几个Qt编程问题的处理
void ImageWidget::resizeEvent(QResizeEvent *event)
常见的几个Qt编程问题的处理
{
常见的几个Qt编程问题的处理    QWidget::resizeEvent(
event);
常见的几个Qt编程问题的处理    QPalette pal(palette());
常见的几个Qt编程问题的处理    pal.setBrush(QPalette::Window, 
常见的几个Qt编程问题的处理                QBrush(_image.scaled(
event->size(), Qt::IgnoreAspectRatio, 
常见的几个Qt编程问题的处理                        Qt::SmoothTransformation)));
常见的几个Qt编程问题的处理    setPalette(pal);
常见的几个Qt编程问题的处理}

常见的几个Qt编程问题的处理


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


23、如何使用WebKit查看的网页进入编辑状态
答:在你的HTML网页代码的HTML元素节点上增加一个属性contenteditable就可以使QWebView中查看的网页进入编辑状态了。
上一篇:在eclipse中配置android ndk的自动编译环境builders


下一篇:How to Modify SAP Form