我正在为一个我无法修改的应用程序编写一个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);
可能我错过了一些东西,但对我而言,两种方法看起来都是完全相同的。不幸的是,其中只有一个正在工作。寻找建议可能是什么问题。
答案 0 :(得分:0)
插槽/信号机制无法使用自定义类Colors
,因为它未在Qt元对象系统中注册。在信号连接之前添加此行解决了问题:
qRegisterMetaType<Colors>("Colors");