【问题标题】:SendMessage of MFC equivalent in QtQt 中 MFC 等价物的 SendMessage
【发布时间】:2013-12-19 12:25:26
【问题描述】:

在 QT 中移植 VS2010 项目。

我想,我之前的帖子不是很清楚,所以我在这里再次解释一下。

问题是.. 我有很多子 Qdialog 窗口,当用户单击时会生成一些消息。我希望这些消息出现在我的主应用程序窗口的 QTablewidget 上。
现在正如一些成员所建议的,我应该看看 VS2010 中的事情是如何完成的,并尝试在 QT 中复制相同的内容。所以这是我的设计.. 请让我知道您的建议/批评。

1) vs 2010 -> 在主应用程序窗口中

MESSAGE_MAP

我们有

ON_MESSAGE( WM_NOTICE, OnAddMessage )
  • 其中 WM_NOTICE = WM_USER+1;

在 QT 中做同样的事情我需要 signal 和 slot 。所以像

connect( sender , SIGNAL(QtSingleApplication::messageReceived ( const QString &message )  ) , this , SLOT ( on_add_message( const QString & message ) );

现在我应该用什么替换这里

  • ‘发件人’? ,在我的情况下,谁将是发件人?
  • SIGNAL (QtSingleApplication::messageReceived) 对吗?
  • 插槽 — 这里没有问题 .. 我可以实现我在其中的代码 将消息按排序顺序放置在 QTable widegt 中。

2) 现在,如果我查看使用 VC++ 开发的现有项目的内部 QDialog windows 源代码 他们有类似的东西

void Message_information::add( const SMS& message )
{
//SMS is a  structure  and fields are SYSTEMTIME, Enum , CString
 CCriticalSection critical_section;
CSingleLock   lock( &critical_section, true );
messages_.insert( message ); // where messages_ is an object std::multiset

SendMessage( dialog_->m_hWnd, WM_MULTIBOXMESSAGE, 0, 0 );
}

现在在 Qt 中做同样的事情

void Message_information::add( const SMS& message )
{
  QMutex mutex;
  mutex.lock();
messages_.insert( message ); // where messages_ is an object std::multiset

//SendMessage( dialog_->m_hWnd, WM_MULTIBOXMESSAGE, 0, 0 );
QtSingleApplication::sendMessage ( // send multiset values here   );

}
  1. 我应该在 SendMessage 中添加什么参数?是事实上的发送消息 调用的函数是否正确?

这个‘add’函数正在其他地方被调用。 我知道这听起来与其他问题重复,我已经查看了为我的一些成员提供的链接,但很抱歉我无法掌握太多。 — 任何建议或批评都可能对我有所帮助.. 非常感谢大家的帮助

【问题讨论】:

  • 大家好,我真的一窍不通,有人可以给我一个提示吗?
  • WM_MULTIBOXMESSAGE 是什么?
  • HI JOnny,这只是在某些文件中声明的一些#defined 变量。我主要关心的是如何在 QT 中向主应用程序发送消息
  • 您好 Jonny,这只是在某些文件中声明的一些#defined 变量。它用于定义私有窗口类使用的私有消息,通常形式为 WM_USER+x,其中 x 是整数值。所以这里是 WM_MULTIBOXMESSAGES WM_USER+ 1

标签: qt mfc sendmessage


【解决方案1】:

在您的情况下,您似乎有多个 QDialog,它们应该向单个 MainApplication 发送内容,对吗?

有什么特殊原因不能通过直接函数调用来实现吗?如:

MyMainWindows * pMainWindow;

...

void MyMainWindows::addMessage( const SMS& message )
{
...
}

void Message_information::add( const SMS& message )
{
  QMutex mutex;
  mutex.lock();
  messages_.insert( message ); // where messages_ is an object std::multiset

  pMainWindow->addMessage( messages_ );
  mutex.unlock();
}

这将与直接连接的信号槽具有相同的效果,并且接近 SendMessage 所做的。

如果有任何特殊原因您不能使用这种结构,请确定它,因为这会影响您应该使用哪种类型的信号/插槽。

如果您对这种结构没有问题,但想使用信号槽而不是直接调用,也请告诉我们,因为将其转换为信号槽代码相当容易(只要您的应用正在运行事件循环和生成信号的代码继承自QObject)

【讨论】:

  • 嗨乔治,谢谢你的回复,好吧,我想我可以这样做,所以我会试一试并告诉你。今天早些时候,我试图从 add 函数发出信号,并在 pmainwindow 中定义了连接。所以让我们看看我能走多远......再次感谢您的帮助
猜你喜欢
  • 2011-04-08
  • 2013-06-13
  • 1970-01-01
  • 2020-09-14
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-03
相关资源
最近更新 更多