使用Qt GUI编写c dll,在自定义小部件中显示失败

我正在为一个我无法修改的应用程序编写一个DLL . 此应用程序正在向我的dll发送请求,我可以在单一请求模式下运行此应用程序或自动运行此应用程序,它可以在某种环路中发送请求和处理响应 . 我不知道这种自动模式是如何工作的,我无法访问源代码来查看差异 .

在我的DLL中,我有一个继承QMainWindow的自定义MainWindow类,它包含两个对象:继承QPlainTextEdit的LogWindow和继承QWidget的自定义Widget . 我想显示一些文本,并根据主应用程序的请求更改我的小部件中的一些属性 . 这一切都适用于单一请求 . 但是,在自动模式下,仅更新文本 . 我需要一些帮助才能在小部件中进行更新 . 现在一些实现细节:

在我的DLL代码中,我有应用程序和主窗口的全局变量:

QApplication * app = nullptr; 
MainWindow * win = nullptr;

我在加载DLL时创建它们:

app = new QApplication(*argc, argv);
win = new MainWindow;
win->show();
app->processEvents();

我的MainWindow看起来像这样:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(this, &MainWindow::message_received, ui->log_window, &LogWindow::appendMessage);
    connect(this, &MainWindow::colors_received, ui->custom_widget, &CustomWidget::set_colors);
}

void MainWindow::append_log(std::string const & str) {
    emit message_received(QString::fromStdString(str));
}
void MainWindow::display_colors(Colors const & colors) {
    emit colors_received(colors);   
}

我根据应用程序的请求调用'append_log()'和'display_colors()' . 这些是被称为的插槽:

void LogWindow::appendMessage(const QString & message) {
    this->appendPlainText(message);
}

在Custom Widget中:

void CustomWidget::set_colors(Colors const & colors) {
    setStyleSheet("background-color: red");
}

根据dll的请求,我调用'win-> append_log()'和'win-> display_colors()' . 正如我在自动模式中所说,只显示文本,但不更新颜色 . 我猜测PlainTextEdit :: appendPlainText()方法必须调用一些更新,但我无法弄清楚如何将行为复制到我的类 . 我试过'update()'和'repaint()'但似乎没什么用 .

我想之前没有人遇到类似的问题,但我会很感激有关尝试或寻找的建议 .

更新

事实证明,在"automatic"模式下运行时,不会调用 CustomWidget::set_colors() 方法 . 我假设它被调用,因为我使用与 LogWindow::appendMessage() 一样的方法来调用它 .

现在问题是它没有被调用的原因 . 一些代码细节:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void append_log(std::string const &);
    void display_colors(Colors const &);
signals:
    void message_received(QString const &);
    void colors_received(Colors const &);

private:
    Ui::MainWindow *ui;
};

class LogWindow : public QPlainTextEdit
{
public:
    LogWindow();
    LogWindow(QWidget * parent);
public slots:
    void appendMessage(QString const &);
};

class CustomWidget : public QWidget
{
    Q_OBJECT

public:
    CustomWidget(QWidget *);
    CustomWidget(QWidget *, Colors);

public slots:
    void set_colors(Colors const &);

};

从生成的 setupUi() 函数:

centralWidget = new QWidget(MainWindow);
centralWidget->setObjectName(QStringLiteral("centralWidget"));
log_window = new LogWindow(centralWidget);
log_window->setObjectName(QStringLiteral("log_window"));
log_window->setGeometry(QRect(10, 10, 421, 561));
custom_widget = new CustomWidget(centralWidget);
custom_widget->setObjectName(QStringLiteral("custom_widget"));
custom_widget->setGeometry(QRect(439, 9, 381, 331));
MainWindow->setCentralWidget(centralWidget);

可能我错过了一些东西,但对我而言,两种方法看起来完全相同 . 不幸的是,其中只有一个正在工作 . 寻找建议可能是什么问题 .

回答(1)

2 years ago

插槽/信号机制无法使用自定义类 Colors ,因为它未在Qt元对象系统中注册 . 在信号连接之前添加此行解决了问题:

qRegisterMetaType<Colors>("Colors");