在QT中怎样获取中文的文件名?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在QT中怎样获取中文的文件名?相关的知识,希望对你有一定的参考价值。

如题,在QT中怎样获取中文的文件名?
用 QFileDialog::getOpenFilename 返回的是QString
识别不了中文的文件名啊~~~~

在你的main函数的第一行前插入以下内容后再试试看:

int main(int argc, char *argv[])

QTextCodec *utf8 = QTextCodec::codecForName("utf8");
QTextCodec::setCodecForCStrings(utf8);
QTextCodec::setCodecForLocale(utf8);
QTextCodec::setCodecForTr(utf8);
......
参考技术A 加一句:QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));
如果QFileDialog::getOpenFilename返回值是filename,则输出时用tr(filename)即可。
参考技术B 我在windows下,用的是QTextCodec::setCodecForTr(QTextCodec::codecForName("system"));

在 Qt 中获取 MouseMoveEvents

【中文标题】在 Qt 中获取 MouseMoveEvents【英文标题】:Getting MouseMoveEvents in Qt 【发布时间】:2010-12-28 10:43:35 【问题描述】:

在我的程序中,我希望在鼠标移动时调用 mouseMoveEvent(QMouseEvent* event)(即使它位于另一个窗口上)。

现在,在我的 mainwindow.cpp 文件中,我有:

void MainWindow::mouseMoveEvent(QMouseEvent* event) 
    qDebug() << QString::number(event->pos().x());
    qDebug() << QString::number(event->pos().y());

但这似乎只有当我在程序本身的窗口上单击并拖动鼠标时才会调用它。我试过打电话

setMouseTracking(true);

在 MainWindow 的构造函数中,但这似乎没有什么不同(mouseMoveEvent 仍然只在我按住鼠标按钮时才被调用,无论它在哪里)。全局跟踪鼠标位置的最简单方法是什么?

【问题讨论】:

【参考方案1】:

您可以在应用程序上使用事件过滤器。

定义并实现 bool MainWindow::eventFilter(QObject*, QEvent*)。例如

bool MainWindow::eventFilter(QObject *obj, QEvent *event)

  if (event->type() == QEvent::MouseMove)
  
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y()));
  
  return false;

在构建 MainWindows 时(或其他地方)安装事件过滤器。例如

MainWindow::MainWindow(...)

  ...
  qApp->installEventFilter(this);
  ...

【讨论】:

谢谢,当鼠标悬停在应用程序窗口上时,它可以持续更新,但如果鼠标移动到其他地方,位置不会更新。 要在窗口外跟踪鼠标,您需要抓住鼠标(参见 QWidget::grabMouse())。由于所有鼠标事件都将发送到已抓取鼠标的小部件,这将阻止与其他小部件的正常交互,除非您仅在鼠标离开窗口时才抓住鼠标(在 leaveEvent() 中)然后释放鼠标在 enterEvent() 上。 添加grabMouse()后,仍然只在鼠标经过应用窗口时更新 使用 grabMouse() 对我有用,但它确实会对尝试与多个窗口进行交互产生负面影响。另一种选择是使用 QTimer 连续轮询鼠标位置,可以使用 QCursor::pos() 检索。 我认为这不是一个正确的答案。要获得连续的鼠标事件,只需调用 setMouseTracking(true)。要在窗口外抓取鼠标,必须使用上述的 grabMouse()。【参考方案2】:

我也遇到了同样的问题,因为我试图调用 this-&gt;update() 以在鼠标移动时重新绘制窗口但什么都不会发生,这进一步加剧了这种情况。

如@Kyberias 所述,您可以通过调用setMouseTracking(true) 来避免创建事件过滤器。但是,这必须在 viewport 上完成,而不是您的主窗口本身。 (更新也是如此)。

因此,您可以在构造函数中添加一行this-&gt;viewport()-&gt;setMouseTracking(true),然后覆盖mouseMoveEvent,而不是创建并安装此过滤器。

【讨论】:

QMainWindow 没有 viewport() 方法。

以上是关于在QT中怎样获取中文的文件名?的主要内容,如果未能解决你的问题,请参考以下文章

怎样在Qt中建立使用动态链接库

如何在 Qt 中获取文件的 MIME 类型?

Qt中怎样读取文件指定的行?

Qt中怎样阻塞父窗口部分控件,而不完全阻塞父窗口所有控件??

如何获取存储在 .qrc Qt 资源文件中的文件列表?

QT获取图片-》改变图片大小-》保存