Qt开发笔记

调试信息输出

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,解决方法有两个:

  1. 用到信号槽,则将该类写在头文件(或者手动生成moc文件再包含到.cpp)
  2. 用不到信号槽,直接去掉Q_OBJECT

QGraphicsScene的缩放问题

在QGraphicsScene中添加过多的Item使滚动条出现后,移除所有Item重新添加,发现这时场景并没有缩小,而是保持原来的滚动条。要使滚动条随着Item数量的增减而改变,只需要在添加Item后重新设置场景。如下:

scene.setSceneRect(scene.itemsBoundingRect())

Qt向导类QWizard的使用

  1. 页面必填项
    在每个向导页注册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]
  1. 返回上一步后数据丢失
    实现向导对话框时,经常需要返回上一步。如果需要保留当前页的信息,必须将option设置为QWizard::IndependentPages
void QWizard::setOption ( WizardOption option, bool on = true )
  1. 页面初始化
    要在页面显示前进行初始化操作,只需重载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超时后关闭

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容