调试信息输出
Qt中可以通过 qInstallMessageHandler
将qDebug()等信息格式化输出,但是release版本默认不输出文件名、行号等,可以通过pro文件中设置。
DEFINES += QT_MESSAGELOGCONTEXT
贴一个自用的配置
void msgOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)
{
QString typeName;
switch (type) {
case QtDebugMsg:
typeName = "Debug";
break;
case QtInfoMsg:
typeName = "Info";
break;
case QtWarningMsg:
typeName = "Warn";
break;
case QtCriticalMsg:
typeName = "Error";
break;
case QtFatalMsg:
typeName = "Fatal";
abort();
}
QString typeInfo = typeName.leftJustified(5, ' ');
QString fileInfo = QString("%1:%2").arg(context.file).arg(context.line);
fileInfo = fileInfo.right(20).rightJustified(20,' ', true);
QString timeInfo = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
QString text = QString("%1 | %2 | %3 | %4").arg(typeInfo, timeInfo, fileInfo, msg);
fprintf(stderr, "%s\n", text.toLocal8Bit().constData());
fflush(stderr);
QString logFileName = QDate::currentDate().toString("./Log/yyyyMMdd.log");
QFile file(logFileName);
if(file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)){
QTextStream tStream(&file);
tStream << text << endl;
file.close();
}else{
qDebug()<< "File Error: " << file.errorString();
}
}
与Q_OBJECT有关的构建错误
在使用QListWidget时需要显示自定义控件,于是在源文件中继承QWidget,实现了简单的列表效果,但构建时出现虚函数表(vtable)
错误如下:
undefined reference to `vtable for`
原来qmake不会处理源文件里的Q_OBJECT
,解决方法有两个:
- 用到信号槽,则将该类写在头文件(或者手动生成moc文件再包含到.cpp)
- 用不到信号槽,直接去掉Q_OBJECT
QGraphicsScene的缩放问题
在QGraphicsScene中添加过多的Item使滚动条出现后,移除所有Item重新添加,发现这时场景并没有缩小,而是保持原来的滚动条。要使滚动条随着Item数量的增减而改变,只需要在添加Item后重新设置场景。如下:
scene.setSceneRect(scene.itemsBoundingRect())
Qt向导类QWizard的使用
- 页面必填项
在每个向导页注册field,如果在name后添加*
,则只有当此field被填充时,【下一步】或【完成】按钮才会变为可用。注册后在QWizard中调用QVariant QWizard::field ( const QString & name ) const
获取值。
void QWizardPage::registerField ( const QString & name, QWidget * widget, const char * property = 0, const char * changedSignal = 0 ) [protected]
- 返回上一步后数据丢失
实现向导对话框时,经常需要返回上一步。如果需要保留当前页的信息,必须将option设置为QWizard::IndependentPages
。
void QWizard::setOption ( WizardOption option, bool on = true )
- 页面初始化
要在页面显示前进行初始化操作,只需重载void QWizardPage::initializePage () [virtual]
即可。如果设置了QWizard::IndependentPages
选项,则该函数只在页面第一次显示时调用。
Qt右键菜单的使用
在QWiget中使用void setContextMenuPolicy(Qt::ContextMenuPolicy policy)
设置菜单的显示方式。点击右键就会有void customContextMenuRequested(const QPoint &pos)
信号,这时在对应的槽中添加QMenu即可,如下:
QMenu popMenu;
popMenu.addAction("删除");
popMenu.exec(QCursor::pos());
QMessageBox定时关闭
要求在QMessageBox弹出后等待,如果用户在规定时间内没有点击,则超时退出。下面是最简单的实现:
QMessageBox msgBox;
msgBox.setWindowTitle("自动关闭测试");
msgBox.setText("5秒内未点击则关闭");
QPushButton *rejectButton = msgBox.addButton("Reject", QMessageBox::RejectRole);
QTimer::singleShot(5000, &msgBox, &QMessageBox::close);
msgBox.exec(); // 阻塞,QTimer超时后关闭