使用Qt GUI编写c ++ dll,在自定义窗口小部件

时间:2017-10-27 15:38:44

标签: c++ qt 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()方法必须调用一些更新,但我无法弄清楚如何将行为复制到我的类。我试过更新()'并且'重绘()'但似乎没什么用。

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

更新

事实证明,在"自动"中运行时,不会调用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 个答案:

答案 0 :(得分:0)

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

qRegisterMetaType<Colors>("Colors");