标签: qapplication

为什么我需要"sys.argv"在PyQt中启动QApplication?

我试着理解PyQt的作用.我没有做过的第一件事就是:

QApplication(sys.argv)
Run Code Online (Sandbox Code Playgroud)

为什么我必须给QApplication这个论点?我知道是什么sys.argv呢.但在我的脚本中,我不需要它.

python pyqt command-line-arguments qapplication

13
推荐指数
2
解决办法
5990
查看次数

如何在Qt中覆盖QApplication :: notify

我试图在我的Qt应用程序中处理异常,我经历了几个帖子,这些帖子表明覆盖QApplication :: notify方法以在Qt中以有效的方式处理异常.我不知道我应该在哪里添加这个重写方法.它是mainwindow.h还是main.cpp?我在MainWindow.h中添加了以下函数:

bool
notify(QObject * rec, QEvent * ev)
{
  try
  {
    return QApplication::notify(rec,ev);
  }
  catch(Tango::DevFailed & e)
  {
    QMessageBox::warning(0,
                         "error",
                         "error");
  }

  return false;
}
Run Code Online (Sandbox Code Playgroud)

当我构建我的项目时,我收到以下错误:

error: cannot call member function 'virtual bool QApplication::notify(QObject*, QEvent*)' without object
Run Code Online (Sandbox Code Playgroud)

我是c ++和Qt的新手.如果你让我知道如何实现这一点,那么我的所有异常都将以有效的方式处理,应用程序不会崩溃.

c++ qt exception qtgui qapplication

10
推荐指数
1
解决办法
6470
查看次数

qApp与QApplication.instance()

使用PyQt5,这两个都返回应用程序对象:

app = QtWidgets.QApplication.instance()
app = QtWidgets.qApp
for i in app.arguments()[1:]:
    ...
Run Code Online (Sandbox Code Playgroud)

但为什么print(QtWidgets.QApplication.instance() is QtWidgets.qApp)打印False

python pyqt instance pyqt5 qapplication

10
推荐指数
1
解决办法
4662
查看次数

多个QApplication实例

我想知道在同一进程中拥有多个QApplication/实例会产生什么影响(问题),以及如何解决与之相关的一些问题。QCoreApplication

场景如下:我想在开源第三方应用程序上制作一个包装器,以便将其转换为可嵌入小部件作为可选插件(该应用程序基本上由基于单一的QMainWindow接口组成)。

此类项目严重依赖QCoreApplication派生类,但基本上是因为它被用作已经存在的单例。我能够修改代码(并且我必须这样做才能将其公开QMainWindow为可嵌入的小部件),尽管由于该项目的复杂性我不能简单地删除父类。

因此,最终的应用程序将有自己的QApplication(在启动时创建),然后可以选择加载上述插件(从而创建第二个QCoreApplication)。只有第一个(主)QApplication用于事件循环 ( QCoreApplication::exec())。

我知道QCoreApplication单身的事实。在我的测试中,单例始终指向最后创建的实例:

qDebug() << qApp;
auto app1 = new QApplication(argc, argv);
qDebug() << qApp;
auto app2 = new TheOtherQApplication(argc, argv);
qDebug() << qApp;
Run Code Online (Sandbox Code Playgroud)

输出是

Q对象(0x0)

QApplication(0x6f9400,名称=“测试”)

QCoreApplication 中的 ASSERT 失败:“应该只有一个应用程序对象”,文件 kernel\qcoreapplication.cpp,第 595 行

TheOtherQApplication(0x2550dc0,名称=“测试”)

TheOtherQApplication(0x2550dc0,名称 =“测试”) TheOtherQApplication(0x2550dc0,名称 =“测试”)

可以看出,QApplication创建第二个实例后,它会替换全局实例。有什么办法可以解决这个问题吗?由于插件是可选的,明显的答案(QApplication在第二位加载主程序)不是一个合适的选择。

另外,拥有多个QApplication实例是否还有其他影响?或者都与事件循环(选中)和单例相关?

注意:由于第三方依赖项尚未完全更新,这是一个基于 Qt 4.7 的项目。计划在一年左右的时间内迁移到最新版本,但目前我必须处理 4.7。


顺便说一句,我已经审查了几个相关的问题,包括这个问题,但它没有提供任何有用的信息。

c++ singleton qt qapplication

9
推荐指数
1
解决办法
6835
查看次数

Qt 中的事件循环是什么?

我已了解以下有关 QApplicationexec功能的信息:

QApplication exec 启动主事件循环。它启动 GUI。它处理信号并在接收到它们时调用适当的时隙。它一直等到 exit 被调用并返回在 exit 中设置的值。

现在,当我们说事件循环时,是否意味着在 Qt 的内部代码中运行了一些 while 循环,并且在那个 while 循环中编写了处理信号和槽的方法?

c++ qt event-loop qapplication

8
推荐指数
1
解决办法
1万
查看次数

是否可以在不调用QApplication :: exec()的情况下创建本地事件循环?

我想创建一个基于其构建的库,QTcpServerQTcpSocket用于在其main函数中没有事件循环的程序中(因为Qt事件循环是阻塞的,并且不能为所需的实时操作提供足够的时序分辨率).

我希望通过在类中创建本地事件循环来解决这个问题,但除非我app->exec()首先调用main函数,否则它们似乎不起作用.有没有办法创建本地事件循环并允许在线程内进行信号/插槽通信而无需应用程序级事件循环?

我已经看过有没有办法在没有QApplication :: exec()的情况下使用Qt?但答案没有帮助,因为似乎解决方案添加了本地事件循环但不删除应用程序循环.

c++ qt event-loop qeventloop qapplication

7
推荐指数
1
解决办法
2272
查看次数

qt5 对“QApplication::QApplication(int&amp;, char**, int)”的未定义引用

我正在尝试运行一个简单的 hello world 示例,并且已经需要一些时间来确定要使用的包含内容 现在我验证了包含路径,QApplication 实际上应该在那里,但它抛出了上述错误。为了清楚起见,我的代码:

#include <QtWidgets/QApplication>
#include <QtWidgets/QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPushButton *button = new QPushButton("Hello world!");
    button->show();
    return app.exec();
}
Run Code Online (Sandbox Code Playgroud)

我试图用第一编译QMAKE -project,然后QMAKE终于做出,然后得到了以下错误:

qt_hello_world.o: In function 'main':  
undefined reference to QApplication::QApplication(int&, char**, int)  
qt_hello_world.cpp: undefined reference to QPushButton::QPushButton(QString const&, QWidget*)
qt_hello_world.cpp: undefined reference to QWidget::show()  
qt_hello_world.cpp: undefined reference to QApplication::exec()  
qt_hello_world.cpp: undefined reference to QApplication::~QApplication()
qt_hello_world.cpp: undefined reference to QApplication::~QApplication()
Run Code Online (Sandbox Code Playgroud)

qmake 创建的 Makefile 包含正确的包含路径到包含 QtWidgets/QApplication 的 …

c++ qt linker-errors qt5 qapplication

7
推荐指数
1
解决办法
3211
查看次数

QApplication 后的清理

我正在将 Qt 桌面应用程序移植到 Linux(Ubuntu 19.10,64 位桌面,Qt 5.12.5,gcc 版本 9.2.1),并且在 QApplication 完成后我看到一些意外的线程保持活动状态。

这是最低限度的再现:

#include <QApplication>
#include <unistd.h>
int main(int argc, char * argv[]) {
    {
        QApplication app(argc, argv);
        sleep(1);
    }
    sleep(10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在不同的时间点调试应用程序,我会看到以下内容:

  • 在运行 QApplication 的构造函数之前,正如预期的那样,只有一个线程,即主线程,存在。
  • 运行 QApplication 的构造函数后,会创建 4 个额外的线程:
    • QXcbEventQueue
    • 主界面
    • 总线
    • QDBusConnection
  • QApplication 的析构函数运行后,QXcbEventQueue 线程消失。
  • 即使在 10 秒的第二次睡眠完成后,除了主线程之外,其他 3 个线程仍然活着:
    • 主界面
    • 总线
    • QDBusConnection

在 QApplication 完成后,我正在寻找一种方法来正确结束这些线程(并进行我目前可能不知道的其他清理工作)(当然,在实际应用程序中,我调用 app.exec() 并执行其他东西)并已被销毁。

这不是应用程序本身的问题,在这 3 个线程仍然活着的情况下到达 main 的末尾似乎没有问题。

该应用程序是使用 Google Test 进行全面测试的更大的库/其他应用程序套件的一部分,这些测试包括一些死亡测试,如果在运行了一些涉及运行 QApplication 的测试后执行,则会抱怨分叉应用程序有多个线程,并且卡住并且永远不会完成,大概是因为这个原因。

关于我如何能够摆脱这些线程并在 QApplication 之后执行完全清理的任何提示?

linux qt multithreading googletest qapplication

7
推荐指数
1
解决办法
229
查看次数

使用new创建Qt QApplication时的分段错误

我有一个程序,其中使用new运算符创建QApplication.它因未知原因而崩溃.我使用RedHat Linux,G ++ 4.8.2,Qt 4.7.2,它是用相同的编译器构建的.

这个源包含许多看似无用但无害的部分,例如带有四个未使用参数的'func'函数.如果我试图删除它们并进一步简化程序,则崩溃不再可以再现,这当然并不意味着问题已经解决.

崩溃发生在函数strlen中,该函数从系统函数XSetCommand调用.添加我自己的简单实现允许我看到strlen收到一个损坏的指针,见下文.

#include <QApplication>
#include <QMessageBox>

void func(void *, void *, void *, void *)  {}

struct Gui
{
  QApplication qApplication;
  Gui(int argc, char ** argv) : qApplication(argc, argv)  {}
};

struct Process
{
  Process(const std::string &, int argc, char ** argv) {
    func(ptr(), ptr(), ptr(), ptr());
    std::string recent;
    std::string path = std::string("Hi!");
    recent           = std::string("Hi!");
    m_message        = std::string("Hi!");
    m_gui = new Gui(argc, argv);
  }
  ~Process()  { delete m_gui; }

  int exec(void) {
    return QMessageBox::warning(0, …
Run Code Online (Sandbox Code Playgroud)

linux qt segmentation-fault new-operator qapplication

6
推荐指数
1
解决办法
3398
查看次数

Qt qDebug不使用QConsoleApplication或QApplication

在使用Qt和Qt Creator开发程序时,我目前遇到了非常烦人的问题.每当我尝试使用qDebug()一个QCoreApplicationQApplication使用前实例化qDebug(),没有任何输出,无论我在Qt Creator中或从一个普通的shell运行程序(我使用Fedora Linux系统的BTW).例如,即使是以下简单代码也会失败:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug() << "TestOutput!" << endl;
}
Run Code Online (Sandbox Code Playgroud)

有谁知道该怎么办这个问题?先谢谢,马吕斯

c++ qt qdebug qcoreapplication qapplication

6
推荐指数
2
解决办法
5042
查看次数