MFC似乎严重缺乏布局管理器/ sizer.很难相信任何自尊的UI库都会缺少sizer但是你去了.我已经发现了一些可以正常处理通常的盒子布局的东西,但是我没有找到的是一个sizer,当你需要在展开时垂直和水平对齐时,它们会有所帮助.
我从这里得到了大部分信息:
我已经浏览了网页,每次搜索MFC和网格/任何东西/最终都会把我送到一堆网格小部件,而不是sizer.在任何地方都有这样的事吗?
好的,在讲授我在C++中使用C风格的可变参数函数之前......其他一切都证明要求重写Qt MOC.
我想知道的是,你是否可以在Qt对象中拥有一个带有任意数量/类型参数的"槽".问题是我真的希望能够生成具有任意签名槽的Qt对象.由于MOC与标准预处理和模板不兼容,因此不可能采用直接方法.我想出了另一个想法:
struct funky_base : QObject
{
Q_OBJECT
funky_base(QObject * o = 0);
public slots:
virtual void the_slot(...) = 0;
};
Run Code Online (Sandbox Code Playgroud)
如果这是可能的话,因为你可以创建一个QObject派生对象的子类模板,只要你不在其中声明新的Qt东西,我应该能够实现一个派生的模板化类型,它接受的...东西和把它变成合适的预期类型.
如果是,我将如何连接它?这会有用吗?
connect(x, SIGNAL(someSignal(int)), y, SLOT(the_slot(...)));
Run Code Online (Sandbox Code Playgroud)
如果没有人尝试过这种疯狂而且不知道的事情,是的,我最终会自己尝试一下......但是我希望有人已经掌握了我可以利用的知识,然后才可能浪费我的时间.
这个问题试图找到一种方法来为模板化对象设计一个"全能"基类,它可以将Qt信号转换为静态信号,如boost :: signals2或只是基本函数.我想如果我能构建一个采用可变参数模板的插槽,我可以使用TMP重建va_args中的参数.这个问题的答案几乎就是这个问题,但是在插槽之前的切入会被qt机制调用.关于如何制作整个文章的系列文章的第一部分展示了我如何解决这部分问题:
http://crazyeddiecpp.blogspot.com/2011/01/quest-for-sane-signals-in-qt-step-1.html
这是我的旧博客位置.如果你想看到其他奇怪的sh1t,我的个人资料中的新人.
我正在使用pimpl成语来隐藏接口的实现细节,以便我可以有一些ABI保护措施.我不是那么精通MS的细节......在我的大部分开发生涯中使用Linux.
我无法从调试器检查窗口查看pimpl的内部.我的类型只扩展到impl的原始指针(它使用智能指针).我已经尝试导出符号,但这似乎不起作用.我想我实际上想要查看的符号没有被导入或者其他东西.
我该如何解决这个问题?可视化器可能会调用函数吗?
编辑 - 也许我把人们与出口事物混为一谈.
我正在尝试这个:
object.h:
struct EXPORT object {
struct EXPORT impl;
impl * pimpl;
};
Run Code Online (Sandbox Code Playgroud)
object.cpp
struct EXPORT object::impl {
char member;
};
Run Code Online (Sandbox Code Playgroud)
我能想到解决问题的唯一方法是将impls放在包含在库的调试版本中的头文件中.希望有更好的解决方案.
我正在编写一个全局钩子DLL,需要在窗口上使用GDI +进行一些绘制以响应事件.我的问题是正在绘制的窗口不断重新绘制自己,所以我绘制的内容会在我想要之前被删除.有什么办法可以阻止窗户在我需要的时候画任何东西吗?
我的钩子目前是一个WH_CALLWNDPROC钩子.使用GDI +完成绘图以响应消息WM_SIZING.我使用GDI +绘制到窗口DC(即GetWindowDC).我正在绘制的内容是正确绘制的,但随着窗口客户区重新绘制,它几乎立即被删除.创建我正在使用的窗口的程序是记事本.当光标闪烁时,我绘制的内容会被删除.
有谁知道我可以暂时挂画窗户的方式?
谢谢!
为模板参数提供参与是不可能的,因为标准不允许这样做.那我怎么能有效地做同样的事呢?
我想要的基本上是一种在拥有它的对象之外无法使用的类型.为什么不是重点,但如果你真的必须知道,我正在尝试制定一套智能指针来解决共享自有资源的问题.因此,我想要做的就是这样,如果它有效:
template < typename T, typename Owner >
struct accessible_member
{
private:
accessible_member() : val(T()) {}
accessible_member(T const& t) : val(t) {}
operator T& () { return val; }
operator T const& () const { return val; }
member_ptr<T> operator & () { return member_ptr<T>(val); }
friend class Owner;
};
Run Code Online (Sandbox Code Playgroud)
因此,一个类不能将该对象保存为成员,除非它声明自己是所有者,并且如果它足够愚蠢地按原样公开它,那么在类之外使用这么愚蠢是不可能的.
由于我们已经切换到VS2010,我们注意到一个新的.filters文件显然包含项目的过滤器结构.我们也使用subversion作为源代码控制.
不幸的是,每次我们签入时,如果有人向项目添加了文件或过滤器,我们最终会遇到合并冲突.SVN似乎绝对无法正确合并此文件类型,即使它是基于文本的.它变得相当令人沮丧.
还有其他人在处理这个问题吗?有没有人找到解决方案?
示例冲突,编码器'a'添加whatever.txt并检入,编码器'b'添加过滤器和新的.cpp文件和更新.得到这个:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="filter_1">
<UniqueIdentifier>{065f6d5d-81b2-4c98-b313-dceb16c24bf2}</UniqueIdentifier>
</Filter>
<Filter Include="filter_2">
<UniqueIdentifier>{85ef5151-d045-4b20-b1bf-e65d380a3cf3}</UniqueIdentifier>
</Filter>
<Filter Include="filter_2\sub_filter_1">
<UniqueIdentifier>{90efdbe3-b53a-41fc-9dfb-147df5e7d7f3}</UniqueIdentifier>
</Filter>
<Filter Include="NewFilter1">
<UniqueIdentifier>{8162b584-12a0-4a05-8cc5-ede4ced07ba3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="filter_2\file_3.hpp">
<Filter>filter_2</Filter>
</ClInclude>
<ClInclude Include="filter_2\sub_filter_1\file_4.hpp">
<Filter>filter_2\sub_filter_1</Filter>
</ClInclude>
<ClInclude Include="filter_1\file_1.hpp">
<Filter>filter_1</Filter>
</ClInclude>
<ClInclude Include="filter_1\file_2.hpp">
<Filter>filter_1</Filter>
</ClInclude>
</ItemGroup>
<<<<<<< .mine
<ItemGroup>
<ClCompile Include="whatnot.cpp">
<Filter>NewFilter1</Filter>
</ClCompile>
</ItemGroup>
=======
<ItemGroup>
<None Include="whatever.txt" />
</ItemGroup>
>>>>>>> .r12513
</Project>
Run Code Online (Sandbox Code Playgroud) 我正在使用Qt Property Browser库作为记录编辑器.当用户完成对任何给定字段的编辑时,通过从编辑项目中删除焦点或按回车键,我希望被告知这一点,以便我可以进行更改,处理它并将其发送到REAL正在改变的项目.
不幸的是,我似乎只能找到propertyChanged和valueChanged信号,并且每次添加或删除任何数量的文本时都会触发它们,而不仅仅是在用户触发完成时.
如果无法获得此通知,我看不出它是如何成为可用组件的.当用户点击[ESC]时它甚至不会恢复,我当然需要能够实现!当然,我绝对没有做出我需要的信号,但我肯定找不到它.
谁知道?
在检查源代码时,制作行编辑器工厂的人做出了与textEdited连接而不是编辑完成的不幸决定.改变是一件相对简单的事情,除非有条理地使得扩展这个具有可扩展接口的编辑器工厂变得不可能!
所有我需要做的是覆盖createEditor函数,断开连接错误,连接更好的连接与之间的调用,以获得线编辑控件之外的字符串.但不是!!!我们不会让你那样做!我们将把所有的会计资料放在一个你无法访问或调用的私有类中,而那些我们打算让你调用的部分将与它们被调用它们的事实紧密联系在一起.编辑控件,而不是其他任何东西.ERGO,我们已经非常有效地让生活变得令人沮丧,我们无法想象.我们不是很棒吗?
我发现了更多.这些对象的标准Qt方法使用委托来控制我想要获得的行为.Qt属性库会覆盖此行为,并执行其他不是我正在尝试完成的操作.QAbstractItemDelegate接口内部是一个setModelData函数,当用户提交其编辑时,它被附加到的视图调用; 它们在没有提交的情况下销毁编辑器时不会被调用.
下一个技巧是学习Qt模型/视图架构并修补库以正确的方式完成.这甚至可能只是简单地删除了破坏我试图获得的行为的重写存根.也许放弃使用这个系统代替简单地使用QtTreeView可能是一个更好的选择,尽管能够保持在不同类型的浏览器之间切换的能力会很好.
这段代码无法在大多数编译器中编译,但起初我直观地期望SFINAE保护我:
typedef void (*A)();
template < typename T >
struct a_metafun { typedef typename T::type type; };
template < typename T >
typename a_metafun<T>::type f(T) {}
template < typename T>
void f(T(*)()) {}
int main() { f(A()); }
Run Code Online (Sandbox Code Playgroud)
我可以通过至少两种方式解决问题:
1)将"metafun"f()的定义更改为:
template < typename T >
typename T::type f(T) {}
2)定义"a_metafun",使得它分析T并且如果T有一个则有一个类型,如果没有则不具有...但是在没有错误的情况下实例化:
BOOST_MPL_HAS_XXX_TRAIT_DEF(type)
typedef < template T, bool = has_type<T>::value >
struct a_metafun { };
typedef < template T >
struct a_metafun<T, true> { typedef typename T::type type };
Run Code Online (Sandbox Code Playgroud)
在查看14.8.2(C++ 03)时,我认为它确切地说明了SFINAE可以应用的条件.有没有更好的地方看?在已经推断出的模板的实例化中失败,即使在扣除另一个模板时,也不会包含在此列表中.
我用来解释造成这种非法行为的另一个方向是,a_metafun的演绎已经发生,其内部的实例化是导致错误的原因.SFINAE在实例化期间不适用,但仅在扣除期间适用,或者我错在那里?但是在第二种情况下,a_metafun正确,并且格式良好地实例化,但它内部没有"类型"定义,这意味着试图实例化它的模板由于替换而失败. …
我当然可以使用is_base如果基类不是模板.但是,当它是,我只是没有看到任何方式来一般匹配任何派生类型.这是我的意思的基本例子:
#include <boost/mpl/bool.hpp>
template < typename T >
struct test_base
{
};
template < typename T >
struct check : boost::mpl::false_ {};
template < typename T >
struct check<test_base<T> > : boost::mpl::true_ {};
struct test_derived : test_base<int> {};
#include <iostream>
int main()
{
std::cout << check<test_derived>::value << std::endl;
std::cin.get();
}
Run Code Online (Sandbox Code Playgroud)
我想要那个回归true_而不是false_.真实示例有7个模板参数,大多数默认,并使用Boost.Parameter按名称引用它们.为了使用is_base我必须能够以某种方式拉出参数,我没有办法做到这一点,没有声明内部typedef.
我认为这是不可能的.希望被证明是错误的.
我已经搜索了这个,但我想我只是让自己更加困惑.
我想要做的是在一个对象中保存一个函数指针,并在稍后的另一个线程中调用它.
我想象的是一个构造函数,它将获取一个函数指针和将传递给该函数指针的参数.该对象还将具有run()方法,该方法将运行所述函数指针和wait_until_completed()方法,该方法将阻塞直到该函数已运行.
如果有意义的话,函数指针应该是来自另一个对象的函数.例如
Foo::*Bar(int);
Run Code Online (Sandbox Code Playgroud)
我有使用pthread_cond_t的wait_until_completed()工作,但我坚持这个函数指针的事情,感觉我只是在圈子里跑来跑去.
有什么建议?
编辑:这是为学校(任何我的一般理解)所以第三方图书馆不能工作:/
我觉得我做了一个非常糟糕的工作来解释这个,让我给出一些示例代码(不包括所有同步的东西)
class Foo
{
public:
Foo(void (Bar::*function) (int), int function_param)
{
// Save the function pointer into this object
this->function = &function;
// Save the paramater to be passed to the function pointer in this object
param = function_param;
}
run()
{
(*function)(param);
}
private:
// The function pointer
void (Bar::*function) (int) = NULL;
// The paramater to pass the function pointer
int param;
}
Run Code Online (Sandbox Code Playgroud)
这简直就是我要做的事情.但是,我不确定它是语法还是我是愚蠢的,但我无法弄清楚如何实际执行此操作并将其编译.
几点思考?并感谢到目前为止的所有建议:)