QT常见问题!!

1 QWidget类有什么用途?
在Qt应用程序中,QWidget用做工作空间.它是底层窗口,在其上可以放置其他对象,如按钮等.

2 a.setMainWidget(&mainwindow);语句的意义是什么?
这段代码告诉Qt,说明mainwindow对象是程序的主部件.当主部件关闭时,整个程序随之结束.
(主部件与其他Qt部件的区别是:当主部件终止时,整个程序就运行结束.)

3 我不理解setGeometry()中的参数究竟代表什么意思?
这一点比较容易混淆.你应该明白,象素(0,0)表示监视器的左上角,而不是我们习惯的左下角.因此,如果你在主窗口中使用setGeometry,setGeometry的第一个参数定义在屏幕的左边和窗口的左上角之间的象素数.第二个参数定义在屏幕的上边和窗口的左上角之间的象素数.接下来的两个参数以象素为单位定义窗口的宽度和高度.一旦你习惯它,这也就不难理解了.

4 为什么不必调用每个对象的show()函数?
当调用父部件的show()函数时,子部件被自动显示.

5 为什么输入this指针代替父部件?
this指针表示在当前类中还未创建的对象.因此,如果设置this指针作为父部件,父部件将是在后面的main()函数中所要创建的对象.

6 什么是qApp?
qApp的创建和this指针想法相同.它是一个指向还未创建的QApplication对象(它在main()中创建)的指针.

7 为什么在main()函数中需要调用a.exec()函数?
在这一行,将程序控制权传递给Qt库.从这里开始,Qt负责处理用户交互和其他程序操作.

8 我的编译器报告传递给connect()函数的参数错误,这是为什么?
connect()函数参数使用对象指针,而不是对象本身.因此,你必须确认所提供的参数是正确的.

9 能否将多个槽连接到一个信号?
能够,这是可能的.只需为每个连接调用一次connect()函数.

10在调用connect()函数时,省略槽所属对象名称意味着什么?
这意味着槽在当前类中定义(也就是说,类是当前所定义类).因此,只能从具有槽的类成员函数中执行这类调用.

11是否能够将一个信号连接到其他信号?如果能,应该怎样操作?
可以.只需象通常一样使用connect()函数,如:
connect(button,SINGAL(clicked()),this,SINGAL(anothersignal()));

12检查是否点击QPushButton对象使用什么信号?
clicked()信号.(应用QPushButton::setDefault()的按钮将变为默认按钮--即用户按回车键时将点击的按钮)

13使用Qprinter::setOrientation()函数(向它传递Qprinter::Portrait或Qprinter::Landscape)能够设置打印方向.


14是否能够选择多个文件?
可以,只要使用QFileDialog::getOpenFiles()函数(注意结尾的s)

15重新编译Qt非常耗时!有没有办法能够加速这一过程?
不能加速实际编译.但是,如果你的存储空间足够,可以在首次编译Qt后将.o文件保留在硬盘上.之后,如果需要重新编译Qt库(例如,增加对gif的支持),这一过程将大大加快.当运行 make clean命令时,.o文件被删除.因此,如果你有足够的空间,可以跳过这一步.

16当使用当前时间时,时间将自动调整为程序运行时区的当地时间吗?
是的,这依赖于计算机的系统时钟.因此,如果它被设置为当地时间,当调用QTime::getCurrent()时QTime将得到当地时间.这也意味着如果你的系统时钟设置是错误的,QTime::getCurrent()将返回错误的时间.

 
 

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:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
   <file>images/copy.png</file>
   <file>images/cut.png</file>
   <file>images/new.png</file>
   <file>images/open.png</file>
   <file>images/paste.png</file>
   <file>images/save.png</file>
</qresource>
</RCC>


然后在.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 <QtCore>
#include <QtGui>

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 读取注册表得到 串口信息的方法!

posted on 2012-07-31 10:30  Rick_w  阅读(740)  评论(0编辑  收藏  举报

导航